AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi const <name> : <datentyp> = <wert> und case <name
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von sveni2211 · begonnen am 23. Jul 2008 · letzter Beitrag vom 24. Jul 2008
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz