Главная страница
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.007 c
15-1371155402
Юрий
2013-06-14 00:30
2013.12.01
С днем рождения ! 14 июня 2013 пятница


4-1238947064
MultIfleX
2009-04-05 19:57
2013.12.01
Имена сеанса и клиента текущщей сессии пользователя


2-1360865736
Вова
2013-02-14 22:15
2013.12.01
исходник функции Mouse_Event хочу


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


15-1370939812
брат Птибурдукова
2013-06-11 12:36
2013.12.01
Подскажите инструмент