Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.047 c
6-1187941092
DragonLand
2007-08-24 11:38
2008.06.01
Клиент для браузерной игры


2-1209984995
Fr1K
2008-05-05 14:56
2008.06.01
Добавление в таблицу данных с суще ствующими датами


15-1208798690
NaRuTo
2008-04-21 21:24
2008.06.01
Delphi VS C++


2-1210649320
noviceman
2008-05-13 07:28
2008.06.01
Как передать запись (TMyRecord) в процедуру...


3-1198498114
Wlad
2007-12-24 15:08
2008.06.01
Связка BDEDatasource и IBDataset





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский