IdUdpClient, как принимать данные в динамическом массиве - PullRequest
0 голосов
/ 26 февраля 2019

Этот код принимает данные в статическом массиве.

TMyRec = record
   MyArray: array[0..1, 0..10] of double;
end;

MyClient: TIdUDPClient;
MyRec: TMyRec;
Buffer: TIdBytes;

SetLength(Buffer, SizeOf(MyRec));
if MyClient.ReceiveBuffer(Buffer, 1) > 0 then
begin
     BytesToRaw(Buffer, MyRec, SizeOf(MyRec));
end;

И как это сделать в динамическом массиве.

TMyRec = record
   MyArray: array of array of double;
end;

1 Ответ

0 голосов
/ 26 февраля 2019

Во-первых, вы выделяете Buffer для SizeOf(MyRec) байтов (176 для версии статического массива), но затем вы читаете только 1 байт из UDP-сокета.Вместо этого вам нужно заменить 1 на SizeOf(MyRec) или Length(Buffer), чтобы соответствовать распределению.

При этом array of array of ... не сохраняется в одном непрерывном блоке памяти.На самом деле это массив указателей на другие массивы, которые разбросаны по всей памяти.Итак, чтобы сделать то, что вы просите, вам нужно сделать что-то вроде этого:

type
  TMyRec = record
    MyArray: array of array of double;
  end;

const
  BytesPerArr = SizeOf(Double) * 11;

var
  MyClient: TIdUDPClient;
  MyRec: TMyRec;
  Buffer: TIdBytes;

...

SetLength(MyRec.MyArray, 2, 11);
SetLength(Buffer, 2 * BytesPerArr);

if MyClient.ReceiveBuffer(Buffer, Length(Buffer)) > 0 then
begin
  Move(Buffer[0], MyRec.MyArray[0][0], BytesPerArr);
  Move(Buffer[BytesPerArr], MyRec.MyArray[1][0], BytesPerArr);
end;
...