Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Pointer в адрес? [D7, WinXP]


Страницы:   1 2

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]

сместит


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо