![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить данные из Pointer
Dmitry_ © (2013-02-20 16:43:00)учусь работать с указателями. по ходу изучения возник вопрос: как извлекать данные из памяти.
есть такой код:
type
PData = ^TData;
TData = packed record
Id: Int;
Count: Int;
end;
procedure GetFromMemory(Memory: Pointer; const MemorySize: Int32);
begin
// здесь нужно получить данные из Memory и вывести их через ShowMessage
end;
procedure GenTestData;
var
Data: TData;
I: Int32;
MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
try
for I := 1 to 3 do
begin
Data.Id := I;
Data.Count := 3;
MS.Write(Data, SizeOf(TData));
end;
GetFromMemory(MS.Memory, MS.Size);
finally
MS.Free;
end;
end;
Не могу понять как сделать обратный цикл и считать данные.
брат Птибурдукова (2013-02-20 17:58:00) [1]
> Уже разобрался.
Извращенец!
//Передавать MemorySize — само по себе плохая идея
procedure GetFromMemory(Memory: Pointer; const MemorySize: Intеger);
var
I: Integer;
P: PData;
begin
if MemorySize mod SizeOf(TData) <> 0 then
raise Exception.Create('Нащяльника, нам подсунули какую-то херню!')
else begin
P := Memory;
for I := 1 to MemorySize div SizeOf(TData) do begin
ShowMessage(Format('%d %d', [P^.Id, P^.Count]);
Inc(P);
end;
end;
end;
Dmitry_ (2013-02-20 17:04:00) [2]Я имел ввиду как из Pointer обратно данные получить. Уже разобрался.
procedure GetFromMemory(Memory: Pointer; const MemorySize: Int32);
var
P: PAnsiChar;
L: Int;
Data: PData;
begin
P := Memory;
L := MemorySize;
P := @P[L];
L := -L;
while L < 0 do
begin
Data := PData(@P[L]);
ShowMessage(IntToStr(Data.Id) + #13#10 + IntToStr(Data.Count));
Inc(L, SizeOf(Data^));
end;
end;
Плохиш (2013-02-20 17:03:00) [3]
> Dmitry_ (20.02.13 16:43)
> учусь работать с указателями.
Начни изучение с основ. Ибо даже рождённый тобой код уже мёртв.
O'ShinW (2013-02-20 16:59:00) [4]for I := 1 to 3 do
begin
Data.Id := i;
Data.Count := i*2;
MS.Write(Data, SizeOf(TData));
end;
MS.Seek(0, 0);
for I := 1 to 3 do
begin
MS.ReadBuffer(Data, SizeOf(TData));
ShowMessageFmt(' Data.Id := %d; Data.Count := %d; ',[ Data.Id, Data.Count ]);
end;
RWolf (2013-02-20 16:58:00) [5]
> как сделать обратный цикл и считать данные
ms.Seek(0, 0);
ms.Read(AnotherData, SizeOf(TData));