4

構造体/レコードの「位置」を取得したいと思います。

私はこの記録を持っているとしましょう:

type
  MyStruct = record
    MyInteger   : Integer;
    MyInteger2  : Integer;
    MyInteger3  : Integer;
    MyFunc      : function (FirstParam : WideString; SecondParam : String) : Integer;
    MyString    : String;
    MyString2   : WideString;
    MyPchar     : pchar;
end;

ご覧のとおり、このレコードのサイズは 28 バイト (7 変数 x 4 バイト) です。基本的に、すべての変数は4バイトの変数(整数など)またはポインター(これも4バイト)のいずれかであるためです。ここで、この構造体をメモリ アドレス (X = 0) にロードしたとします (これは、MyInteger のアドレスが 0 になることも意味します)。MyInteger3 のアドレス (たとえば) は 8 になります (X = 0 に注意してください!) 構造体の位置 (番号/アドレス) を動的に取得するにはどうすればよいですか?

私が何を意味するか知っていることを願っていますか?前もって感謝します。

ところで: Var は構造体で常に 4 バイトですか? 編集: spcae を修正すると、これは間違っています:String[100]

4

2 に答える 2

9

ポインター演算を使用して、任意のレコード メンバーのオフセットを取得できます。

type
  PMyStruct = ^MyStruct;

var
  Offset: Integer;
begin
  Offset := Integer(@(PMyStruct(nil).MyInteger3));
  // or:
  // Offset := Integer(Addr(PMyStruct(nil).MyInteger3));
end;

関数のオフセットが必要な場合は、次のようにコーディングする必要があります。

Offset := Integer(@@PMyStruct(nil).MyFunc);
// or:
// Offset := Integer(Addr(@PMyStruct(nil).MyFunc));
于 2012-11-01T02:39:05.167 に答える
7
program OffsetTest; {$APPTYPE CONSOLE}

type
  f = function (FirstParam : WideString; SecondParam : String) : Integer;
  TStruct = record
    MyInteger   : Integer;
    MyInteger2  : Integer;
    MyInteger3  : Integer;
    MyFunc      : ^f;
    MyString    : String;
    MyString2   : WideString;
    MyPchar     : pchar;
  end;

var MyStruct :TStruct;

begin
  Writeln( int64(@(MyStruct.MyInteger )) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyInteger2)) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyInteger3)) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyFunc    )) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyString2 )) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyPchar   )) - int64(@(MyStruct)));
  Readln;
end.

32 ビット バージョンでの結果:

0 
4 
8
12
20
24

64 ビット バージョンでの結果:

0
4
8
16
32
40

64 ビット、パックされたレコードの結果:

0
4
8
12
28
36

コードでこれらのオフセットに依存するのは悪い考えである可能性があることを指摘するために、さまざまな結果を示します。または、少なくとも、状況が異なればオフセットも異なる可能性があることに十分注意してください。

于 2012-11-01T02:47:00.100 に答える