![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Heap
Heap © (2006-02-09 16:41:00)Подскажите, как после выделения памяти с ней работать. Допустим в память надо запистать 100 random байт, сохранить их в файл, а 37й показать на экране. Это пример просто для того чтобы понять как работать с памятью
umbra (2006-02-09 20:06:00) [1]
procedure test;
var
p: PChar;
m: string;
i, res: integer;
begin
i := 100;
Getmem(p, 100);
strlcopy(p + 2, @i, sizeof(integer));
res := integer((p+2)^);
m := IntToStr(res);
ShowMessage(m);
FreeMem(p);
end;
Heap (2006-02-09 17:43:00) [2]А смещения?
Джо (2006-02-09 17:31:00) [3]Используй
move.
Heap (2006-02-09 17:26:00) [4]
> Джо © (09.02.06 17:18) [6]
> Используй указатель типа PByte. А еще проще — динамические
> массивы.
Я же говорю мне необходимо записывать данные разного размера.
Т.е. пробовал
p:^byte;
a:array of byte;
...
p:=@a[0];
p^:=$abcd;
...
ругается на несовместимость типов, или чет типа того. Оно и понятно нельзя в байт записать два байта. А потом уже в хелпе откопал:
Do not apply the dereference operator (^) to a dynamic-array variable or pass it to the New or Dispose procedure.
Поэтому нельзя использовать для инициализации никаких типов.
Джо (2006-02-09 17:18:00) [5]> [5] Heap (09.02.06 17:14)
> Необходимо иметь указатель, и относительно него смещаться
> и читать/писать значения.
Так за чем дело стало?
Используй указатель типа PByte. А еще проще — динамические массивы.
Heap (2006-02-09 17:14:00) [6]
> Чем не устраивает?
> Gero © (09.02.06 17:07) [3]
Не использую VCL.
> Джо © (09.02.06 17:07) [4]
> Тогда, просьба объяснить — что есть "свободные манипуляции
> с ней"?
Необходимо иметь указатель, и относительно него смещаться и читать/писать значения.
Gero (2006-02-09 17:07:00) [7]> Нечто вроде
> Stream.Position
> Stream.Write
> Stream.Read
> Как это реализовать?
Чем не устраивает?
Джо (2006-02-09 17:07:00) [8]> [2] Heap (09.02.06 17:05)
> Это не подходит. Мне необходима память для свободной манипуляции
> с ней.
Тогда, просьба объяснить — что есть "свободные манипуляции с ней"?
Heap (2006-02-09 17:05:00) [9]Это не подходит. Мне необходима память для свободной манипуляции с ней.
Записываемые и читаемые данные имеют разный размер. Нечто вроде
Stream.Position
Stream.Write
Stream.Read
Как это реализовать?
Джо (2006-02-09 16:47:00) [10]Вопрос слишком широк. Нужно читать литературу.
Вот пример работы с дин. памятью "для почина":
type
PMyInformation = ^TMyInformation;
TMyInformation = record
A,B: Integer;
end;
var
MyInfo: PMyInformation;
begin
// выдылели необходимый блок памяти в куче
// указатель на него сохранили в переменной MyInfo
GetMem (MyInfo, SizeOf(TMyInformation));
try
// Работаем с информацией через указатель на нее
MyInfo^.A := 10;
MyInfo^.B := 20;
finally
// освобождаем выделенную память
FreeMem (MyInfo);
end;
end;