Aufzählungen mit expliziter ordinaler Überschreibung sind ein neues Feature ab Delphi6.<br>
Anscheinend hat der Compiler ein Problem mit vorzeichenbehafteten Integer-Werten, wenn der vorhergehende Wert noch im positiven Integer-Bereich lag.<br>
Das betrifft sowohl SizeOf (sollte eigentlich SizeOf(Typ) sein), als auch den eigentlichen Wert.
<pre><p><b>type</b>
PFoo = ^TFoo;
TFoo = (
fooBar,
fooBug0 = Longint($80000000),
fooBug1 = Longint($80000001),
fooBug2 = Longint($80000080)
);
<p>
<b>procedure</b> TForm1.Button1Click(Sender: TObject);
<b>begin</b>
ShowMessage(
IntToHex(Ord(fooBug0), SizeOf(fooBug0) * 2) + #13#10 + <i>// '00'</i>
IntToHex(Ord(fooBug1), SizeOf(fooBug1) * 2) + #13#10 + <i>// '01'</i>
IntToHex(Ord(fooBug2), SizeOf(fooBug2) * 2) + #13#10); <i>// 'FFFFFF80' !!!</i>
<b>end</b>;</pre><p>
Das Problem würde nicht auftreten, wenn fooBar <b>nicht</b> deklariert worden wäre. Das Verhalten ist nicht genau nachzuvollziehen - siehe fooBug2 (es lassen sich etliche merkwürdige Beispiele dieser Art erstellen, bei denen immer das MSB gesetzt ist).
Versionen: Delphi 6 (7 ungetestet)
Workaround: keiner
Lösung: klassische Aufzählungen verwenden (Typ als Longint und Werte als Konstanten deklarieren).
- nico<br>
<br>
Anscheinend hat der Compiler ein Problem mit vorzeichenbehafteten Integer-Werten, wenn der vorhergehende Wert noch im positiven Integer-Bereich lag.<br>
Das betrifft sowohl SizeOf (sollte eigentlich SizeOf(Typ) sein), als auch den eigentlichen Wert.
<pre><p><b>type</b>
PFoo = ^TFoo;
TFoo = (
fooBar,
fooBug0 = Longint($80000000),
fooBug1 = Longint($80000001),
fooBug2 = Longint($80000080)
);
<p>
<b>procedure</b> TForm1.Button1Click(Sender: TObject);
<b>begin</b>
ShowMessage(
IntToHex(Ord(fooBug0), SizeOf(fooBug0) * 2) + #13#10 + <i>// '00'</i>
IntToHex(Ord(fooBug1), SizeOf(fooBug1) * 2) + #13#10 + <i>// '01'</i>
IntToHex(Ord(fooBug2), SizeOf(fooBug2) * 2) + #13#10); <i>// 'FFFFFF80' !!!</i>
<b>end</b>;</pre><p>
Das Problem würde nicht auftreten, wenn fooBar <b>nicht</b> deklariert worden wäre. Das Verhalten ist nicht genau nachzuvollziehen - siehe fooBug2 (es lassen sich etliche merkwürdige Beispiele dieser Art erstellen, bei denen immer das MSB gesetzt ist).
Versionen: Delphi 6 (7 ungetestet)
Workaround: keiner
Lösung: klassische Aufzählungen verwenden (Typ als Longint und Werte als Konstanten deklarieren).
- nico<br>
<br>
Comment