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

Вниз

Народ, раскажите мне, как работать с переменной Pointer.   Найти похожие ветки 

 
Dima1   (2003-01-13 08:49) [0]

Например, имея выделенный кусок памяти GetMem(), получить по этому указателю доступ к нужным байтам. Понимаю что простой вопрос, но я его так до сих пор и не понял.
Для примера.

Var
P : Pointer;
begin
GetMem(P,100);
FillMemory(P,100);

....
{вот тут я бы хотел предположим, положить по 5 смещению байт = $54. Как это мне сделать ???, Я понимаю что чтото вроде P^ := 54.
Но как ему указать нужное смещение, ведь P - указывает как я понимаю на начало выделенного блока.
...

FreeMem(P);
end;


 
MBo ©   (2003-01-13 08:56) [1]

нужно использовать типизированные указатели
var p:pbyte; (или : ^byte)

p^:=54;

или приводить нетипизированный к нужному типу
var p:pointer

pbyte(p)^:=54;


в данном случае может быть удобно и так

var p:pbytearray;

p[4]:=54;


 
Юрий Зотов ©   (2003-01-13 09:12) [2]

> Но как ему указать нужное смещение

В Win32 указатель - это просто беззнаковое целое. Стало быть, с ним можно выполнять все арифметические действия, как с обычным целым числом. А чтобы не ругался компилятор, ему надо сообщить, что мы не ошиблись, а понимаем свои действия - то есть, использовать приведение типов.

type
PByte = ^byte;

PByte(Integer(P) + 5)^ := $54;



 
MBo ©   (2003-01-13 09:15) [3]

Кроме того, с типизированными указателями работают операторы Inc и Dec
var p:pbyte; (или : ^byte)

inc(p,5);// указатель смещается на 5*размер базового типа, здесь 1
p^:=54;



 
Digitman ©   (2003-01-13 10:15) [4]

PByteArray(p)[5] := $54;


 
Dima1   (2003-01-14 02:43) [5]

С указателями на масив, мне понятно, там все просто. Но там надо заранее знать длинну. Мне важно было разобратся именно с нетипизированным указателем, по работе с блоками памяти. В принципе я уже вьехал что к чему.
Для меня правильное решение будет : > Юрий Зотов
вместо 5, я могу подставить счетчик !!!


Например


Var
i : Integer;
..
For i := 0 to ??? do PByte(Integer(P) + i)^ := MyByte;


лижбы не вылететь за пределы :)

Тема закрыта. !
Спасибо всем.


 
Anatoly Podgoretsky ©   (2003-01-14 08:03) [6]

Зачем же мучаться с приведением и прочим, ведт привел же тебе MBO пример с pByteArray, очень удобно и ясно.



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

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

Наверх




Память: 0.48 MB
Время: 0.016 c
1-72191
x777
2003-01-13 18:29
2003.01.23
Получение текущей даты и времени


1-72404
MyNameIsVova
2003-01-13 17:10
2003.01.23
TStringList. Поочередный вызов файлов из списка.


1-72235
cult
2003-01-14 16:33
2003.01.23
Высота шапки формы(где Caption и системные кнопки)


1-72223
СОС
2003-01-14 05:34
2003.01.23
Дано Х {3} кнопок при нажатию на любую из них выдается окно и тол


3-72043
Snake
2003-01-05 08:37
2003.01.23
Свойство Recordset компонента ADODataset...