Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.01;
Скачать: CL | DM;

Вниз

Pointer в адрес?   Найти похожие ветки 

 
Zoom ©   (2008-05-05 17:43) [0]

А как можно Pointer преобразовать в Integer адрес, затем прибавить какое-то значение и обратно в Pointer , вообщем инкрементировать Pointer на какое-то число байт ???


 
Игорь Шевченко ©   (2008-05-05 17:47) [1]

Pointer(Integer(p) + 1234)


 
Palladin ©   (2008-05-05 17:50) [2]

Есть великое изобретение: type casting. Прочитав любую книженцию про язык программирования турбо паскаль, ты откроешь для себя, что:

Var
p:Pointer;
...
p:=Pointer(Integer(p)+4);


сместит указатель на эти самые 4б.

А почитав любую книженцию про язык программирования Delphi aka Object Pascal, ты откроешь для себя, что:

Var
PI:^Integer;
PB:^Byte;
PW:^Word;

Inc(PI) - семестит указатель PI на SizeOf(Integer)
Inc(PB) - семестит указатель PI на SizeOf(Byte)
Inc(PW) - семестит указатель PI на SizeOf(Word)


и все благодаря Compiler Magic

Читайте книжки, господа.


 
Palladin ©   (2008-05-05 17:52) [3]

извиняюсь

Inc(PI) - семестит указатель PI на SizeOf(Integer)
Inc(PB) - семестит указатель PB на SizeOf(Byte)
Inc(PW) - семестит указатель PW на SizeOf(Word)


Ctrl + Ins, Shift + Ins иногда в такие неудобные положения ставит :)


 
Игорь Шевченко ©   (2008-05-05 17:53) [4]

сместит


 
Германн ©   (2008-05-05 18:02) [5]


> Ctrl + Ins, Shift + Ins иногда в такие неудобные положения
> ставит :)

Замени их на Ctrl+C, Ctrl+V :)


 
Palladin ©   (2008-05-05 18:03) [6]

не могу... это у меня в крови...


 
Zoom ©   (2008-05-05 18:19) [7]

Большое Спасибо очень помогли !!! 3 часа пропарился в helpe :)))
как всегда все гениальное просто :)
p:=Pointer(Integer(p)+4);


 
Anatoly Podgoretsky ©   (2008-05-05 19:17) [8]

> Palladin  (05.05.2008 17:52:03)  [3]

Китайцы хоть и древнея цивилизация, но программисты у них ленивые.


 
@!!ex ©   (2008-05-05 19:29) [9]

> [5] Германн ©   (05.05.08 18:02)

ага... а потом недоумение, а чегойэто файрфокс в линюхе по умолчанию не копипастит на Ctrl+C, Ctrl+V... а на Insert копипастит... скотина.


> [7] Zoom ©   (05.05.08 18:19)

лучше действительно использовать типизированный указатель и inc/dec


 
Германн ©   (2008-05-06 00:59) [10]


> @!!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-06 07:07) [11]

> Лучше для чего?

для читабельностИ?


 
Ega23 ©   (2008-05-06 10:37) [12]


> не могу... это у меня в крови...


Кстати, я тожe Ctrl+C - Ctrl+V только на ноутбуке пользуюсь (там Ins немного неудобно расположен)


 
Игорь Шевченко ©   (2008-05-06 11:05) [13]


> для читабельностИ?


а если указатель каждый раз надо на разное количество байт двигать ?


 
Reindeer Moss Eater ©   (2008-05-06 11:13) [14]

Inc(pb,n);


 
Игорь Шевченко ©   (2008-05-06 11:15) [15]

Reindeer Moss Eater ©   (06.05.08 11:13) [14]

Это все хорошо, но результатом сложения хочется иметь слегка типизированный указатель :)


 
Reindeer Moss Eater ©   (2008-05-06 11:29) [16]

Так inc только с типизированным и прокатит


 
Игорь Шевченко ©   (2008-05-06 11:34) [17]

Reindeer Moss Eater ©   (06.05.08 11:29) [16]

Ну да. А прибавлять нужно разное произвольное количество байт :) На входе типизированый указатель на структуру, на выходе тоже хочется его же.


 
Reindeer Moss Eater ©   (2008-05-06 11:52) [18]

Странное желание. :)
Имеем валидный PDWORD, хотим увеличить его на семь, а там у нас тоже не рыбу заворачивали, а аккурат начало другого DWORD"а лежит.
Или я чего-то не понял?


 
palva ©   (2008-05-06 12:27) [19]

Поддерживаю Reindeer Moss Eater
Pointer указывает "ни на что", поэтому с ним так неудобно работать: При разыменовании указывать тип, а при сдвиге переводить в целое. Чтобы не приводить к целому можно вместо пойнтера использовать PChar. Но все равно получается непонятный код, затуманивающий суть. В оригинальном паскале пойнтера нет, насколько я помню. Нужно по мере возможности пользоваться типизированными указателями. В этом случае сдвиг соответствует переходу на следующий элемент массива. Если требуется сдвигать на разное число байтов, то это как правило означает, что указатель указывает на поля записи. Корректнее и понятнее в этом случае пользоваться записями record. Но конечно, так бывает не всегда. Иногда я читаю из файла длину поля и должен переместиться на его конец. Длина поля переменная и описать это общим рекордом не получится. Если не гнаться за эффективностью, то можно написать процедуру, которая будет вытаскивать поле переменной длины и укладывать его в строку или в динамический массив. Как бы то ни было, я бы постарался избежать запутанной работы с пойнтерами.


 
Игорь Шевченко ©   (2008-05-06 13:07) [20]

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 таких структур, требуется пробежаться по всем и с каждой что-то сделать.


 
Reindeer Moss Eater ©   (2008-05-06 13:33) [21]

В этом случе легче завести тип
PFoo = ^TFoo
натравить его на структуру, а с полями так и работать как с полями рекорда


 
Игорь Шевченко ©   (2008-05-06 13:59) [22]

Reindeer Moss Eater ©   (06.05.08 13:33) [21]

Э...структуры как бы неодинаковые по размеру. И для того, чтобы переходить от одной к другой, нужно указатель каждый раз перемещать на разное количество байт, а именно, в моем примере на SizeOf(TFoo) + BarSize - sizeof(WChar);


 
Reindeer Moss Eater ©   (2008-05-06 14:25) [23]

Тады PByte и кастинг (единственный) к PFoo после инкремента.



Страницы: 1 вся ветка

Текущий архив: 2008.06.01;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.021 c
2-1209925848
ChaosAD
2008-05-04 22:30
2008.06.01
авторизация в приложении на FireBird


15-1208514276
Вопрос
2008-04-18 14:24
2008.06.01
Как вам картинка ? 3dsmax.


15-1208513403
Hadroran
2008-04-18 14:10
2008.06.01
установка компонент


2-1209821949
Alex8
2008-05-03 17:39
2008.06.01
БД


2-1210235520
Андрей Пл
2008-05-08 12:32
2008.06.01
Размер в байтах!!!