![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Pointer в адрес? [D7, WinXP]
Zoom © (2008-05-05 17:43:00)А как можно Pointer преобразовать в Integer адрес, затем прибавить какое-то значение и обратно в Pointer , вообщем инкрементировать Pointer на какое-то число байт ???
Reindeer Moss Eater (2008-05-06 14:25:00) [1]Тады PByte и кастинг (единственный) к PFoo после инкремента.
Игорь Шевченко (2008-05-06 13:59:00) [2]Reindeer Moss Eater © (06.05.08 13:33) [21]
Э...структуры как бы неодинаковые по размеру. И для того, чтобы переходить от одной к другой, нужно указатель каждый раз перемещать на разное количество байт, а именно, в моем примере на SizeOf(TFoo) + BarSize - sizeof(WChar);
Reindeer Moss Eater (2008-05-06 13:33:00) [3]В этом случе легче завести тип
PFoo = ^TFoo
натравить его на структуру, а с полями так и работать как с полями рекорда
Игорь Шевченко (2008-05-06 13:07:00) [4]Reindeer Moss Eater © (06.05.08 11:52) [18]
> Странное желание. :)
Ничего странного:
имеем структуру
type
TFoo = packed record
Foo1: DWORD;
Foo2: array[1..2] of Word;
BarSize: Word;
Bar: array[0..0] of Wchar; //реальный размер определяется полем BarSize
end;
PFoo = ^TFoo;
имеем указатель на область памяти, содержащую последовательность из 10 таких структур, требуется пробежаться по всем и с каждой что-то сделать.
palva (2008-05-06 12:27:00) [5]Поддерживаю Reindeer Moss Eater
Pointer указывает "ни на что", поэтому с ним так неудобно работать: При разыменовании указывать тип, а при сдвиге переводить в целое. Чтобы не приводить к целому можно вместо пойнтера использовать PChar. Но все равно получается непонятный код, затуманивающий суть. В оригинальном паскале пойнтера нет, насколько я помню. Нужно по мере возможности пользоваться типизированными указателями. В этом случае сдвиг соответствует переходу на следующий элемент массива. Если требуется сдвигать на разное число байтов, то это как правило означает, что указатель указывает на поля записи. Корректнее и понятнее в этом случае пользоваться записями record. Но конечно, так бывает не всегда. Иногда я читаю из файла длину поля и должен переместиться на его конец. Длина поля переменная и описать это общим рекордом не получится. Если не гнаться за эффективностью, то можно написать процедуру, которая будет вытаскивать поле переменной длины и укладывать его в строку или в динамический массив. Как бы то ни было, я бы постарался избежать запутанной работы с пойнтерами.
Reindeer Moss Eater (2008-05-06 11:52:00) [6]Странное желание. :)
Имеем валидный PDWORD, хотим увеличить его на семь, а там у нас тоже не рыбу заворачивали, а аккурат начало другого DWORD'а лежит.
Или я чего-то не понял?
Игорь Шевченко (2008-05-06 11:34:00) [7]Reindeer Moss Eater © (06.05.08 11:29) [16]
Ну да. А прибавлять нужно разное произвольное количество байт :) На входе типизированый указатель на структуру, на выходе тоже хочется его же.
Reindeer Moss Eater (2008-05-06 11:29:00) [8]Так inc только с типизированным и прокатит
Игорь Шевченко (2008-05-06 11:15:00) [9]Reindeer Moss Eater © (06.05.08 11:13) [14]
Это все хорошо, но результатом сложения хочется иметь слегка типизированный указатель :)
Reindeer Moss Eater (2008-05-06 11:13:00) [10]Inc(pb,n);
Игорь Шевченко (2008-05-06 11:05:00) [11]
> для читабельностИ?
а если указатель каждый раз надо на разное количество байт двигать ?
Ega23 (2008-05-06 10:37:00) [12]
> не могу... это у меня в крови...
Кстати, я тожe Ctrl+C - Ctrl+V только на ноутбуке пользуюсь (там Ins немного неудобно расположен)
@!!ex (2008-05-06 07:07:00) [13]> Лучше для чего?
для читабельностИ?
Германн (2008-05-06 00:59:00) [14]
> @!!ex © (05.05.08 19:29) [9]
>
> > [5] Германн © (05.05.08 18:02)
>
> ага... а потом недоумение, а чегойэто файрфоксв линюхе
> по умолчанию не копипастит на Ctrl+C, Ctrl+V... а на Insert
> копипастит... скотина.
>
А это не мои проблемы!
:)
> > [7] Zoom © (05.05.08 18:19)
>
> лучше действительно использовать типизированный указатель
> и inc/dec
>
Лучше для чего?
@!!ex (2008-05-05 19:29:00) [15]> [5] Германн © (05.05.08 18:02)
ага... а потом недоумение, а чегойэто файрфокс в линюхе по умолчанию не копипастит на Ctrl+C, Ctrl+V... а на Insert копипастит... скотина.
> [7] Zoom © (05.05.08 18:19)
лучше действительно использовать типизированный указатель и inc/dec
Anatoly Podgoretsky (2008-05-05 19:17:00) [16]> Palladin (05.05.2008 17:52:03) [3]
Китайцы хоть и древнея цивилизация, но программисты у них ленивые.
Zoom (2008-05-05 18:19:00) [17]Большое Спасибо очень помогли !!! 3 часа пропарился в helpe :)))
как всегда все гениальное просто :)
p:=Pointer(Integer(p)+4);
Palladin (2008-05-05 18:03:00) [18]не могу... это у меня в крови...
Германн (2008-05-05 18:02:00) [19]
> Ctrl + Ins, Shift + Ins иногда в такие неудобные положения
> ставит :)
Замени их на Ctrl+C, Ctrl+V :)
Игорь Шевченко (2008-05-05 17:53:00) [20]сместит