![]() |
const <name> : <datentyp> = <wert> und cas
Hallo.
Ich verwende Delphi 7 und habe folgendes Problem. Wenn ich eine Konstante von einem bestimmten Typ erzeugen will, muss ich in der Definition von const ja den Datentypen angeben. Verwende ich diesen in einem case of behauptet Delphi, die Konstante sei nicht konstant. Das ist natürlich etwas sinnfrei. Den Compiler- Schalter für zuweisbare Konstanten habe ich aus. Damit sollten meine Konstanten doch wohl wirklich konstant sein. Der Compiler läßt sich davon leider nicht überzeugen. Ich will eine Konstante vom Typ Byte erzeugen. Lasse ich die Typangabe weg, macht mir Delpi immer shortint draus. Das will ich aber nicht. Kann ich das CASE irgendwie überreden, meinen konstante Konstante als konstant anzusehen? Hintergrund ist, dass diese Konstante (verschiedenen Typen) zu einem Netzwerk- Handshaking gehören. Darum will ich alle Typen wirklich fest definieren. Ich bin mir nämlich nicht sicher, dass Delphi den Datentype BYTE, der übertragen werden soll, vergrößert, weil Shortint ja negativ sein kann. Wie ist das eigentlich, wenn das Programm auf verschiedenen Rechnern ausgeführt wird. Kann ich mich da eigentlich darauf verlassen, dass die Datentypenlängen immer die selben sind, wenn ich dem Compiler die Vergabe überlasse (eben z.B. nur schreibe const <name> = <wert>), oder kann das z.B. auf einem 64 Bit Win zu einem längeren Datentypen führen als unter XP 32 Bit? |
Re: const <name> : <datentyp> = <wert> und
Lass doch den Typ weg.
|
Re: const <name> : <datentyp> = <wert> und
Das geht doch?
Delphi-Quellcode:
const
test:byte = 99; begin case test of 99: ; end; end; |
Re: const <name> : <datentyp> = <wert> und
Hallo,
versuche es so:
Delphi-Quellcode:
Gruß Hawkeye
const
Value = Byte(42); begin ShowMessage (IntToStr(SizeOf(Value))); end; |
Re: const <name> : <datentyp> = <wert> und
Danke Hawkeye219, so geht es.
Arbeite zwar schon lange mit Delphi, aber diese Notation kannte ich ehrlich gesagt noch nicht. Funktioniert einwandfrei. Danke. |
Re: const <name> : <datentyp> = <wert> und
Ok, schön das dein Problem gelöst ist. Wo da jetzt das CASE ist verstehe ich zwar nicht, ist ja auch egal. Daran sehe ich nur wieder, dass sich mir diese geheimen Dinge einfach nicht erschliessen, bin einfach zu blöd für sowas :gruebel:
|
Re: const <name> : <datentyp> = <wert> und
Eine Konstante mit einem case abzufragen, ergibt nicht viel Sinn. Ich vermute daher, dass er die Konstante als Case-Label einsetzen wollte. Typisierte Konstanten werden aber in Delphi fast wie Variablen behandelt, deshalb ist dies nicht möglich.
|
Re: const <name> : <datentyp> = <wert> und
@omata:
Der Quellcodeauschnitt den du geschrieben hast, funktioniert. Das Problem taucht hier auf:
Delphi-Quellcode:
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.
const
test:byte = 99; var i:byte; begin i := 99 case i of test : ; end; end; 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:
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:
const
test : byte = 1; ... test := 100;
Delphi-Quellcode:
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.
var
test : byte = 1; 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. :wink: |
Re: const <name> : <datentyp> = <wert> und
Zur Information: Typisierte Konstanten sind vollkommen verschieden von untypisierten. Untypisierte werden praktisch direkt im Quelltext aufgelöst, entsprechen also grob vereinfacht #define in C. Typisierte Konstanten sind hingegen Variablen mit der Einschränkung, dass sie im Status J- nicht direkt verändert werden dürfen. Du kannst aber mit PCardinal(@MeineTypisierteCardinalKonstante)^ := 42 den Wert ändern.
|
Re: const <name> : <datentyp> = <wert> und
In anderen Sprachen ist es auch so das Constanten nicht für Case etc. verwendet werden können.
In Delphi geht das schon, du musst nur die Angabe des Types weg lassen. Sobald du einen Typ angibst wird es als eine Variable gewertet und vermutlich kannst du somit später diesen Wert durch patchen einer Stelle auch ändern. Lässt man den Typ weg wird beim Compilieren überall wo die Konstante verwendet wird der Wert eingetragen und somit funktioniert es auch. Warum willst du überhaupt den Typ angeben? Bei einer Konstante ist der Typ doch völlig egal?! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz