Forum: Object-Pascal / Delphi-Language
Delphi
by ma2xx,
28. Nov 2005
Ich bin für neue Ideen immer dankbar ...
Wenn ich folgenden Code teste ...
TTest = record
case Typ:Boolean of
{$A-}
false: (T1 :Integer);
true: (T2 :Double);
{$A+}
end;
Forum: Object-Pascal / Delphi-Language
Delphi
by ma2xx,
25. Nov 2005
Nunja, wir kommen wohl nicht weiter ...
Mein Eindruck ist, dass hier ein Delphi-Bug vorliegt.
Meine Versuche zeigten, dass die Anfangsadressen von T1 und T2 abhängig von der Position des Typ sind, egal ob der Typ vor der case oder in der case steht. Es ist auch egal wie lang die varianten Teile des Record sind.
Es bleibt also als Workaround nur das Einfügen von Bytes bis ein gerade Adresse...
Forum: Object-Pascal / Delphi-Language
Delphi
by ma2xx,
25. Nov 2005
Es ist offensichtlich, dass das Problem die Speicherausrichtung ist.
TTest = record
case Typ:Boolean of
false: (T1 :Integer);
true: (T2 :Double);
end;
- TTest wird je nach Compilerschalter gerade ausgerichtet (Startadresse)
- Typ (Boolean) ist 1Byte lang (wäre es ein Aufzählungstyp, dann auch 1Byte, es sei denn man aktiviert {$Z4} (4Bytes))
- Es folgt...
Forum: Object-Pascal / Delphi-Language
Delphi
by ma2xx,
25. Nov 2005
Als Workaround kann ich natürlich alle records auf gerade Adressen trimmen indem ich Dummy-Bytes einführe. Das ist auch die derzeitige Lösung. Leider besteht das original Projekt aus ein paar Duzend Records die miteinander verschachtelt sind. Hier manuell eine Ausrichtung auf die korrketen Adressen durchzuführen ist aufwendig und frustrierend. Ich denke schon, dass das die Aufgabe des Compilers...
Forum: Object-Pascal / Delphi-Language
Delphi
by ma2xx,
25. Nov 2005
Variante 1 - Fehler:
@Test.Typ: $12F3E4
@Test.T1: $12F3E8
@Test.T2: $12F3EC
Variante 2 - OK, aber ist ja auch packed record:
@Test.Typ: $12F3EB
@Test.T1: $12F3EC
@Test.T2: $12F3EC
Forum: Object-Pascal / Delphi-Language
Delphi
by ma2xx,
25. Nov 2005
Korrekt, ist das selbe:
Debugger meldet
@Test.T1: $12F3E8
@Test.T2: $12F3EC
wobei var Test:TTest;
... immernoch 4 Byte unterschied!
Forum: Object-Pascal / Delphi-Language
Delphi
by ma2xx,
25. Nov 2005
Beim Zugriff auf die Varianten Teile eines Records sollten diese normalerweise auf der gleichen Adresse liegen, oder?
TTest = record
case Typ:Boolean of
false: (T1 :Integer);
true: (T2 :Double);
end;