将 CopyRecord 从柏林翻译成 XE2
Translate CopyRecord from Berlin to XE2
我正在尝试使用以下代码:https://github.com/hiro2233/mavlink_pascal
由 RAD Studio Berlin 编写。
它使用了这个函数:
CopyRecord(@msg_data_PARAM_VALUE, packet_data, TypeInfo(mavlink_param_value_t));
其中:
mavlink_param_value_t = record
param_value: Single;
param_count: Word;
param_index: Word;
param_id: array[0..15] of Byte;
param_type: Byte;
end;
msg_data_PARAM_VALUE:mavlink_param_value_t;
packet_data:System.TArray<System.Byte>;
我正在使用 RAD Studio XE2,它无法识别此功能。
我尝试在线查找,但找不到任何内容。
谁能帮我解决一下?
干杯,
E.
只需使用 System.Move()
即可:
procedure THelpers.packet_msg_data_set(packet:System.TArray<System.Byte>; msg_id:UInt8; data_length:UInt8);
var
packet_data:System.TArray<System.Byte>;
begin
case msg_id of
MAVLINK_MSG_ID.MAVLINK_MSG_ID_PARAM_VALUE:
begin
//SetLength(packet_data, data_length); // <-- redundant!
packet_data:= Copy(packet,6,data_length);
//CopyRecord(@msg_data_PARAM_VALUE, packet_data, TypeInfo(mavlink_param_value_t));
Move(packet_data[0], msg_data_PARAM_VALUE, SizeOf(msg_data_PARAM_VALUE));
end;
MAVLINK_MSG_ID.MAVLINK_MSG_ID_HEARTBEAT:
begin
//SetLength(packet_data, data_length); // <-- redundant!
packet_data:= Copy(packet,6,data_length);
//CopyRecord(@msg_data_HEARTBEAT, packet_data, TypeInfo(mavlink_heartbeat_t));
Move(packet_data[0], msg_data_HEARTBEAT, SizeOf(msg_data_HEARTBEAT));
end;
end;
end;
有问题的代码正在将字节从 TArray<Byte>
复制到 2 个可能的 record
中的第一个,并且那些 record
中的所有字段都只是基本类型,那里不涉及指针或引用计数。所以我不知道为什么作者选择使用CopyRecord()
依赖RTTI来复制那些字节,那个函数根本不应该直接使用。
我正在尝试使用以下代码:https://github.com/hiro2233/mavlink_pascal
由 RAD Studio Berlin 编写。
它使用了这个函数:
CopyRecord(@msg_data_PARAM_VALUE, packet_data, TypeInfo(mavlink_param_value_t));
其中:
mavlink_param_value_t = record
param_value: Single;
param_count: Word;
param_index: Word;
param_id: array[0..15] of Byte;
param_type: Byte;
end;
msg_data_PARAM_VALUE:mavlink_param_value_t;
packet_data:System.TArray<System.Byte>;
我正在使用 RAD Studio XE2,它无法识别此功能。
我尝试在线查找,但找不到任何内容。
谁能帮我解决一下?
干杯, E.
只需使用 System.Move()
即可:
procedure THelpers.packet_msg_data_set(packet:System.TArray<System.Byte>; msg_id:UInt8; data_length:UInt8);
var
packet_data:System.TArray<System.Byte>;
begin
case msg_id of
MAVLINK_MSG_ID.MAVLINK_MSG_ID_PARAM_VALUE:
begin
//SetLength(packet_data, data_length); // <-- redundant!
packet_data:= Copy(packet,6,data_length);
//CopyRecord(@msg_data_PARAM_VALUE, packet_data, TypeInfo(mavlink_param_value_t));
Move(packet_data[0], msg_data_PARAM_VALUE, SizeOf(msg_data_PARAM_VALUE));
end;
MAVLINK_MSG_ID.MAVLINK_MSG_ID_HEARTBEAT:
begin
//SetLength(packet_data, data_length); // <-- redundant!
packet_data:= Copy(packet,6,data_length);
//CopyRecord(@msg_data_HEARTBEAT, packet_data, TypeInfo(mavlink_heartbeat_t));
Move(packet_data[0], msg_data_HEARTBEAT, SizeOf(msg_data_HEARTBEAT));
end;
end;
end;
有问题的代码正在将字节从 TArray<Byte>
复制到 2 个可能的 record
中的第一个,并且那些 record
中的所有字段都只是基本类型,那里不涉及指针或引用计数。所以我不知道为什么作者选择使用CopyRecord()
依赖RTTI来复制那些字节,那个函数根本不应该直接使用。