Форум: "Начинающим";
Текущий архив: 2013.12.01;
Скачать: [xml.tar.bz2];
ВнизПолучить данные из Pointer Найти похожие ветки
← →
Dmitry_ (2013-02-20 16:43) [0]учусь работать с указателями. по ходу изучения возник вопрос: как извлекать данные из памяти.
есть такой код:
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;
Не могу понять как сделать обратный цикл и считать данные.
← →
RWolf © (2013-02-20 16:58) [1]
> как сделать обратный цикл и считать данныеms.Seek(0, 0);
ms.Read(AnotherData, SizeOf(TData));
← →
O'ShinW © (2013-02-20 16:59) [2]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;
← →
Плохиш © (2013-02-20 17:03) [3]
> Dmitry_ (20.02.13 16:43)
> учусь работать с указателями.
Начни изучение с основ. Ибо даже рождённый тобой код уже мёртв.
← →
Dmitry_ (2013-02-20 17:04) [4]Я имел ввиду как из 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:58) [5]
> Уже разобрался.
Извращенец!
//Передавать 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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.12.01;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c