此代码接受静态数组中的数据。
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;
答案 0 :(得分:1)
首先,您要为Buffer
字节分配SizeOf(MyRec)
(对于静态数组版本为176),但是随后您仅从UDP套接字读取1个字节。您需要用SizeOf(MyRec)
或Length(Buffer)
代替1,以匹配分配。
话虽这么说,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;