Перевести CopyRecord из Берлина в XE2 - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь использовать код из: 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, и она не распознает эту функцию.

Я пытался искать в Интернете, но ничего не могу найти.

Может ли кто-нибудь помочь мне разобраться?

Приветствия, Е.

1 Ответ

3 голосов
/ 22 апреля 2020

Просто используйте 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> в 1 из 2 возможных record с, и все поля в этих record являются только фундаментальными типами, в них не используются указатели или ссылки. Поэтому я не знаю, почему автор решил использовать CopyRecord(), чтобы полагаться на RTTI для копирования этих байтов, эта функция вообще не должна использоваться напрямую.

...