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

Вниз

Народ, раскажите мне, как работать с переменной 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
14-72483
.:Grits:.
2003-01-01 16:25
2003.01.23
Help for Win32?


1-72246
TTCustomDelphiMaster
2003-01-13 20:14
2003.01.23
Excel NumberFormat


14-72536
БиМ
2003-01-05 07:52
2003.01.23
Virtual & Override


14-72495
NOE
2003-01-06 12:59
2003.01.23
389-й порт and TCP/IP


3-72120
Sirus
2002-12-31 07:19
2003.01.23
Как программно переименовать алиас BDE???





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский