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

Вниз

Получить данные из 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.006 c
1-1318903108
Acid_Burn
2011-10-18 05:58
2013.12.01
Связать memo с текстом между тегами(html)


15-1371232669
wl
2013-06-14 21:57
2013.12.01
Дурацкий вопрос)


2-1361347270
O'ShinW
2013-02-20 12:01
2013.12.01
Один и тот же поток в одну и туже крит.секцию


2-1361225309
TStas
2013-02-19 02:08
2013.12.01
КАк завут словарь Ворда?


15-1371052001
О-Сознание
2013-06-12 19:46
2013.12.01
Флаг в LongInt.