将 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来复制那些字节,那个函数根本不应该直接使用。