2

データ型 tbytes と tidbytes の間の互換性の問題について、TBytes と TidBytes の間の Delphi XE4 Indy の互換性の問題に関する記事を既に見ました。私が学んだ2番目の答えから、両方ともバイトの配列であっても、一緒に使用できないように見えます。ただし、最新の回答によると、indy 10.5.9 では TBytes の存在に依存しており、Indy 10.6 でのみバイト配列として完全に送信されました。とにかく、 IdUDPServerUDPRead イベントからいくつかのパケットをデコードする .pas ユニットがありますが、それらをまとめることができません。[dcc32 エラー] Unit1.pas(216): E2250 There is no overloaded version of 'Unpack' that can be called with these arguments

Unpack は正しく宣言されています。

    class function Unpack(Bytes: TBytes; Count: Integer): TOSCPacket; overload;
class function Unpack(Bytes: TBytes; Offset, Count: Integer; TimeTag: Extended
    = 0): TOSCPacket; overload; virtual;

そして、私が知る限り、それの私の使用法もそうです:

OSCPacket.Unpack(AData, Length(Adata));

ここで、AData はバイト配列です。

ここで何が間違っているのですか?私は何時間もグーグルで検索してきましたが、Unpack関数のパラメーターリストに入れるために、ADataから実際に使用可能な変数にデータをマージ、変換、コピー、移動などする方法を見つけることができません。

どんな助けでも大歓迎です。

ありがとう、

マークス

4

1 に答える 1

4

2 つのUnpackメソッドは type のパラメータを受け取りますTBytes。そのため、その型の変数を渡す必要があります。array of Byteと代入互換性のない型の変数を渡していますTBytes

変数をTBytesの代わりにと宣言して、問題を修正してくださいarray of Byte

Delphi での型の互換性はややこしいものです。個人的には、互換性ルールをより緩和した一般的な動的配列を常に使用しています。したがって、関連するすべてのコードを制御している場合ではTArray<Byte>なく、使用することを選択します。TBytes

もう 1 つのオプションは、最も柔軟なパラメーターであるオープン配列を使用することです。例えば。

class function Unpack(const Bytes: array of Byte; Count: Integer): TOSCPacket;

TBytesその関数には、TIdBytes、 、array of ByteTArray<Byte>、オープン配列コンストラクター、静的バイト配列などの変数を渡すことができます。

constそれらのコピーを作成するオーバーヘッドを回避するために、配列パラメーターも宣言する必要があることに注意してください。

更新 1

ADataは実際にはオープン配列であり、動的配列ではないことが明らかになります。その場合、関数がオープン配列を受け取るようにする必要があります。

あなたのコードは type のメソッド内で実行されていると思いますTUDPReadEvent:

type
  TUDPReadEvent = procedure(AThread: TIdUDPListenerThread; AData: array of Byte; 
    ABinding: TIdSocketHandle) of object;

その場合TIdBytesは関係ありません。ここにはそのタイプのものはありません。AData動的配列ではなく、オープン配列パラメータです。そのため、オープン配列も使用するように関数を宣言する必要があります。

余談ですが、インディの人々がTUDPReadEvent. ADataパラメータは実際には として渡す必要がありますconstRemy のコメントを参照してください。これを台無しにしたのは Emba でした。

オープン配列パラメーターと動的配列の違いを完全に理解するには、オープン配列パラメーターのドキュメントを読む必要があります。

更新 2

これらのインターフェイスのいずれも変更できない場合は、それらの間にアダプターを配置するだけです。例えば:

function CopyBytes(const Bytes: array of Byte): TBytes;
var
  Count: Integer;
begin
  Count := Length(Bytes);
  SetLength(Result, Count);
  if Count > 0 then
    Move(Bytes[0], Result[0], Length(Bytes));
end;
于 2013-10-16T11:40:28.337 に答える