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

Вниз

Heap   Найти похожие ветки 

 
Heap   (2006-02-09 16:41) [0]

Подскажите, как после выделения памяти с ней работать. Допустим в память надо запистать 100 random байт, сохранить их в файл, а 37й показать на экране. Это пример просто для того чтобы понять как работать с памятью


 
Джо ©   (2006-02-09 16:47) [1]

Вопрос слишком широк. Нужно читать литературу.

Вот пример работы с дин. памятью "для почина":

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;


 
Heap   (2006-02-09 17:05) [2]

Это не подходит. Мне необходима память для свободной манипуляции с ней.
Записываемые и читаемые данные имеют разный размер. Нечто вроде
Stream.Position
Stream.Write
Stream.Read
Как это реализовать?


 
Gero ©   (2006-02-09 17:07) [3]

> Нечто вроде
> Stream.Position
> Stream.Write
> Stream.Read
> Как это реализовать?

Чем не устраивает?


 
Джо ©   (2006-02-09 17:07) [4]

> [2] Heap   (09.02.06 17:05)
> Это не подходит. Мне необходима память для свободной манипуляции
> с ней.

Тогда, просьба объяснить — что есть "свободные манипуляции с ней"?


 
Heap   (2006-02-09 17:14) [5]


> Чем не устраивает?


> Gero ©   (09.02.06 17:07) [3]


Не использую VCL.


> Джо ©   (09.02.06 17:07) [4]


> Тогда, просьба объяснить — что есть "свободные манипуляции
> с ней"?

Необходимо иметь указатель, и относительно него смещаться и читать/писать значения.


 
Джо ©   (2006-02-09 17:18) [6]

> [5] Heap   (09.02.06 17:14)
> Необходимо иметь указатель, и относительно него смещаться
> и читать/писать значения.

Так за чем дело стало?
Используй указатель типа PByte. А еще проще — динамические массивы.


 
Heap   (2006-02-09 17:26) [7]


> Джо ©   (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:31) [8]

Используй move.


 
Heap   (2006-02-09 17:43) [9]

А смещения?


 
umbra ©   (2006-02-09 20:06) [10]

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;



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

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

Наверх




Память: 0.49 MB
Время: 0.048 c
2-1139659377
Интересующийся
2006-02-11 15:02
2006.02.26
Пример по работе с ресурсами из DLL


2-1139571644
Shuma
2006-02-10 14:40
2006.02.26
Обмен по TCP


2-1139164512
Виталий___
2006-02-05 21:35
2006.02.26
Использование компонент в функциях


2-1139225976
tytus
2006-02-06 14:39
2006.02.26
TBucketList


8-1126701118
Littlekan
2005-09-14 16:31
2006.02.26
Уровень ProgressBar на мониторе