Einzelnen Beitrag anzeigen

sveni2211

Registriert seit: 22. Dez 2006
Ort: Friedrichroda
38 Beiträge
 
#8

Re: const <name> : <datentyp> = <wert> und

  Alt 23. Jul 2008, 20:59
@omata:

Der Quellcodeauschnitt den du geschrieben hast, funktioniert.

Das Problem taucht hier auf:

Delphi-Quellcode:
const
  test:byte = 99;
var
  i:byte;
begin
  i := 99
  case i of
    test : ;
  end;
end;
Vom Verstand her müsste das vollkommen legitim sein. Ich habe einen Byte- Wert den ich mit einem unveränderlichen Byte- Wert vergleiche. Delphi (7) meckert jedoch, das test nicht konstant sei.

Das ganze ist ein Erbe vom Delphi- Compiler. In alten Delphi- Versionen (2, ob die 3 da auch noch betroffen war bin ich mir nicht sicher, ist zu lange her) war es nun möglich, einer Konstante im Quelltext einen neuen Wert zuzuweisen.
Folgendes war also tatsächlich möglich:

Delphi-Quellcode:
const
  test : byte = 1;

...

  test := 100;
Im Fall der überschreibbaren Konstanten macht Delphi intern eine Variable aus der Konstanten in initialisiert die einfach mit dem zugewiesen Wert. Intern wird also das draus:

Delphi-Quellcode:
var
  test : byte = 1;
Und eine Variable darf in einem CASE nicht verwendet werden. Also behauptet Delphi, auch wenn in der Version explizit die überschreibbaren Konstanten abgeschaltet sind, die Konstante sei nicht konstant.
Ob das ein Fehler im Delphi- Compiler ist oder er einfach nur derart abwärts Kompatibel ist, weiß ich natürlich nicht.
Eventuell ist das in einer höheren Delphi- Version anders.


Die Variante von Hawkeye219 interpretiere ich nun so, dass die Konstante gecastet wird. Ich gebe die Variable an und sage ihr, nimm den Wert 1 vom Typ Byte. Da Delphi nun die Konstante so erweitert, dass der Datentyp vom Wert 1 rein passt, macht Delphi da nun ein Byte draus. Denn 0 kann nicht unterschritten werden, Shortint reicht nur bis 127, ist also zu kurz, da Byte bis 255 gehen kann, also wird ein Byte daraus.

Sage ich dagegen nur const <name> = 1, kann die 1 für mehrere Datentypen stehen. Angefangen von Int64 bis runter zum Shortint. Da Delphi Shortint als kleinsten Typ ansetz und die 1 da rein passt, nimmt es automatisch Shortint. Würde ich <name> = 128 setzen, wird Byte (?) genommen (oder schon Integer?). Da 128 nicht in ShortInt rein passt.
Aus irgendeinem Grund werden in Delphi die Vorzeichenbehafteten Typen vorgezogen. Also ShortInt dem Byte, Integer dem Word, LongInt dem LongWord. Warum auch immer. Nicht jeder denkt von vornherein negativ.
  Mit Zitat antworten Zitat