Просто используйте 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 для копирования этих байтов, эта функция вообще не должна использоваться напрямую.