5

32 ビット プラットフォームで動作しますが、64 ビットでは動作しません。

  TVerbInfo = packed record
    Verb: Smallint;
    Flags: Word;
  end;

var
  VerbInfo: TVerbInfo;
  strList : TStringList;
  verb : Smallint;
  flags : Word;
begin
  strList := TStringList.create();
  .....
  verbInfo.verb := verb;
  verbInfo.flags := flags;
  strList.addObject('verb1',TObject(VerbInfo));  //invalid typecast happened here
end;

誰でも私を助けることができますか?どうもありがとうございます

4

3 に答える 3

3

あなたのキャストTObject(VerbInfo)はコンパイルされSizeOf(TObject) = SizeOf(TVerbInfo)ます. ただしTObject、ポインタであるため、そのサイズはアーキテクチャによって異なります。一方、SizeOf(TVerbInfo)はアーキテクチャによって異なりません。したがって、キャストは 1 つのアーキテクチャでしか機能しません。

ジェネリック以前の Delphi では、このようなキャストを使用する必要がありました。しかし最近では、汎用コンテナーを使用する必要があります。

たとえば、リストがあり、文字列が一意である場合は、辞書を使用できます。

TDictionary<string, TVerbInfo>

重複する文字列が存在する可能性がある場合は、新しいレコード宣言が必要になります。

type
  TVerbInfo = record
    Name: string
    Verb: Integer;
    Flags: Word;
  end;

そして、これらのリストを

TList<TVerbInfo>

最後のポイントは、パックされたレコードの使用を避けるべきだということです。これらの結果、データ構造が正しく整列されず、パフォーマンスの低下につながります。

于 2013-12-19T11:49:02.227 に答える
1

これを異なるプラットフォームで実行し、結果を比較する必要があると思います

ShowMessage( IntToStr( SizeOf( Integer ) ) );
ShowMessage( IntToStr( SizeOf( Pointer ) ) );
ShowMessage( IntToStr( SizeOf( TVerbInfo ) ) );
ShowMessage( IntToStr( SizeOf( TObject ) ) );

サイズが異なるため、ハードキャストはできないと思います。

次のような回避策を試すことができます

type TBoth = record
  case byte of
    0: ( rec: TVerbInfo);
    1: ( obj: TObject);
  end;

TDictionary<String, TVerbInfo>の代わりに typeを使用することもできますTStringList

于 2013-12-19T11:34:34.160 に答える