Форум: "Начинающим";
Текущий архив: 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