Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить данные из 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));


Наверх

Титульная страница Поиск, карта сайта Написать письмо