Einzelnen Beitrag anzeigen

NicoDE
(Gast)

n/a Beiträge
 
#21

Re: Zugriff auf Variante Teile in Record-Typen

  Alt 28. Nov 2005, 15:56
Zitat von ma2xx:
Wenn ich folgenden Code teste ...
Delphi-Quellcode:
TTest = record
    case Typ:Boolean of
{$A-}
    false: (T1 :Integer);
    true: (T2 :Double);
{$A+}
end;
... dann erhalte ich tatsächlich gleiche Adressen für T1 und T2:
Weil es das gleiche ist, als wenn du die Struktur als 'packed' deklariert hättest.

Test-Code:
Delphi-Quellcode:
type
  TTest = record
    case Typ: Boolean of
{$A-}
      False: (T1: Integer);
      True: (T2: Double);
{$A+}
  end;

function FieldOffset(const Struct, Field): Cardinal;
begin
  Result := Cardinal(Addr(Field)) - Cardinal(Addr(Struct));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Test: TTest;
begin
  ShowMessage(
    'T1: ' + IntToStr(FieldOffset(Test, Test.T1)) + #13#10 +
    'T2: ' + IntToStr(FieldOffset(Test, Test.T2))
    );
end;
Ergebnis (Delphi 6):
Code:
T1: 1
T2: 1
Ziel sollte aber sein, dass beide Offsets 8 sind (wie in der C-Referenzstruktur).


Gruß Nico
  Mit Zitat antworten Zitat