4

バイトの配列に格納されているデータをTListにあるレコードのセットに移動する必要がありますが、このエラーが発生します

E2197定数オブジェクトをvarパラメーターとして渡すことができません

このコードは問題を再現します。

uses
  System.Generics.Collections,
  System.SysUtils;

type
  TData = record
    Age : Byte;
    Id  : Integer;
  end;

//this code is only to show the issue, for simplicity i'm filling only the first  
//element of the TList but the real code needs fill N elements from a very big array.  
var
  List : TList<TData>;
  P : array [0..1023] of byte;
begin
  try
    List:=TList<TData>.Create;
    try
      List.Count:=1;
      //here i want to move the content of the P variable to the element 0
      Move(P[0],List[0], SizeOf(TData));

    finally
      List.Free;
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

バッファの内容をTList要素にコピーする方法

4

2 に答える 2

3

XE2では、の内部ストレージTList<T>は不透明で非表示になっています。通常の方法ではアクセスできません。リストの要素へのすべてのアクセスがコピーされます–基盤となるストレージへの参照は利用できません。したがって、を使用してそれにブリットすることはできませんMove。ブリットできる構造が必要な場合は、動的配列を検討する必要がありますTArray<T>

TList<TData>プライベート変数を公開するクラスヘルパーを実装するトリックをいつでも使用できますFItems。それはかなりハッキーですが、あなたが求めることをします。

type
  __TListTData = TList<TData>;
  //defeat E2086 Type 'TList<T>' is not yet completely defined

type
  TListTDataHelper = class helper for TList<TData>
    procedure Blit(const Source; Count: Integer);
  end;

procedure TListTDataHelper.Blit(const Source; Count: Integer);
begin
  System.Move(Source, Pointer(FItems)^, Count*SizeOf(Self[0]));
end;

パラメータチェックを入れたいと思うかもしれませんがTListTDataHelper.Blit、それはあなたにお任せします。

TList<T>XE3を使用している場合は、プロパティを使用してのプライベートストレージにアクセスできますList

Move(P, Pointer(List.List)^, N*SizeOf(List[0]));

ブリットする必要がなく、forループを使用できる場合は、次のようにします。

type
  PData = ^TData;
var
  i: Integer;
  Ptr: PData;
....
List.Count := N;
Ptr := PData(@P);
for i := 0 to List.Count-1 do
begin
  List[i] := Ptr^;
  inc(Ptr);
end;

しかし、私はあなたがこのオプションを避けたいというあなたの質問を解釈します。

于 2013-01-15T23:00:08.233 に答える
1

を使用する代わりに、代わりにプロパティ セッターMove()を使用してみてTList<T>.Items[]、コンパイラと RTL にコピーを処理させます。

type
  PData = ^TData;
  ...

List[0] := PData(@P[0])^;
于 2013-01-16T01:35:46.157 に答える