Announcement

Collapse
No announcement yet.

Aufzählungen mit explizieten Ordinalen (>= Delphi 6)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Aufzählungen mit explizieten Ordinalen (>= Delphi 6)

    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>

  • #2
    Unter Delphi 7 kann dies mit {$MINENUMSIZE 4} umgangen werden (unter Delphi 6 bleibt das Ergebnis falsch).<br>

    - nic

    Comment

    Working...
    X