![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Народ, раскажите мне, как работать с переменной Pointer. [D6, WinXP]
Dima1 © (2003-01-13 08:49:00)Например, имея выделенный кусок памяти GetMem(), получить по этому указателю доступ к нужным байтам. Понимаю что простой вопрос, но я его так до сих пор и не понял.
Для примера.
Var
P : Pointer;
begin
GetMem(P,100);
FillMemory(P,100);
....
{вот тут я бы хотел предположим, положить по 5 смещению байт = $54. Как это мне сделать ???, Я понимаю что чтото вроде P^ := 54.
Но как ему указать нужное смещение, ведь P - указывает как я понимаю на начало выделенного блока.
...
FreeMem(P);
end;
Anatoly Podgoretsky (2003-01-14 08:03:00) [1]Зачем же мучаться с приведением и прочим, ведт привел же тебе MBO пример с pByteArray, очень удобно и ясно.
Dima1 (2003-01-14 02:43:00) [2]С указателями на масив, мне понятно, там все просто. Но там надо заранее знать длинну. Мне важно было разобратся именно с нетипизированным указателем, по работе с блоками памяти. В принципе я уже вьехал что к чему.
Для меня правильное решение будет : > Юрий Зотов
вместо 5, я могу подставить счетчик !!!
Например
Var
i : Integer;
..
For i := 0 to ??? do PByte(Integer(P) + i)^ := MyByte;
лижбы не вылететь за пределы :)
Тема закрыта. !
Спасибо всем.
Digitman (2003-01-13 10:15:00) [3]PByteArray(p)[5] := $54;
MBo (2003-01-13 09:15:00) [4]Кроме того, с типизированными указателями работают операторы Inc и Dec
var p:pbyte; (или : ^byte)
inc(p,5);// указатель смещается на 5*размер базового типа, здесь 1
p^:=54;
Юрий Зотов (2003-01-13 09:12:00) [5]> Но как ему указать нужное смещение
В Win32 указатель - это просто беззнаковое целое. Стало быть, с ним можно выполнять все арифметические действия, как с обычным целым числом. А чтобы не ругался компилятор, ему надо сообщить, что мы не ошиблись, а понимаем свои действия - то есть, использовать приведение типов.
type
PByte = ^byte;
PByte(Integer(P) + 5)^ := $54;
MBo (2003-01-13 08:56:00) [6]нужно использовать типизированные указатели
var p:pbyte; (или : ^byte)
p^:=54;
или приводить нетипизированный к нужному типу
var p:pointer
pbyte(p)^:=54;
в данном случае может быть удобно и так
var p:pbytearray;
p[4]:=54;