Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - "constant expression expected" bei "case" und Konstanten
der organist - Fr 20.08.10 19:58
Titel: "constant expression expected" bei "case" und Konstanten
Hi alle zusammen,
hab mir mittlerweile zum dritten Male an meinem Projekt versucht und habe bisher keine Idee mehr.
Der Quelltext ist folgender (gekürzt):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| const right:Integer=0; up:Integer=1; left:Integer=2; down:Integer=3;
[..]
type
[..]
TArrow = class private PosX,PosY:Integer; Typ:Integer; Item:TBitMap; public constructor Create(const APath:String;ATyp:Integer); procedure Paint(APaintbox:TPaintbox;AEckeX,AEckeY:Integer); end;
[..]
constructor TArrow.Create(const APath:string;ATyp:Integer); begin Typ:=ATyp; Item:=TBitMap.Create; Item.Width:=34; Item.Height:=32; case Typ of right:begin Item.LoadFromFile(APath+'Items\PfeilRechts.bmp'); PosX:=593; PosY:=274; end; up:begin Item.LoadFromFile(APath+'Items\PfeilOben.bmp'); PosX:=349; PosY:=100; end; left:begin Item.LoadFromFile(APath+'Items\PfeilLinks.bmp'); PosX:=100; PosY:=275; end; down:begin Item.LoadFromFile(APath+'Items\PfeilUnten.bmp'); PosX:=349; PosY:=446; end; end; end; |
mein Problem ist der Error: constant expression expected. Gilt nicht nur für das markierte "right", sondern auch für "up","left" und "down".
Sind die Konstanten nicht konstant genug?
Gruss, Lukas
EDIT: Umbennen der Konstanten hat auch nicht geklappt.
ALF - Fr 20.08.10 20:13
Hi, wo soll Typ denn hinspringen wenn es keinen Wert besitzt, also weder 0 noch 3 ist
Gruss Alf
elundril - Fr 20.08.10 20:17
Dann wird die Case-Struktur einfach nicht ausgeführt. ;) Das hier funktioniert zb ohne mussen und knurren des compilers:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var a: integer; begin a := 4; case a of 1: Showmessage('a'); 2: Showmessage('b'); 3: Showmessage('c'); end; end; |
So, zum fehler. Definiert Up, Down usw so:
Delphi-Quelltext
1: 2: 3: 4:
| RIGHT = 0; UP = 1; LEFT = 2; DOWN = 3; |
Grund ist der, weil du mit dem Integer dazwischen keine Konstanten im eigentlichen Sinn hast sondern typisierte Konstanten und diese kann man in Prozeduren verändern wie Variablen. ;)
lg elundril
der organist - Fr 20.08.10 20:28
danke Elundril, das funzt. Man lern nie aus, auch bei simpelsten Dingen. An Alf, Typ wird ja gesetzt, durch die übergeben Variabel ATyp. Und die liegt garantiert [0..3]. ;)
delfiphan - Fr 20.08.10 20:43
Historisch bedingt ist so ein const eher eine Variable mit Initialwert, bei der zur Compilezeit nicht erlaubt ist darauf zu schreiben. Zur Laufzeit unterscheiden sich die Dinger nicht von normalen Variablen. Wenn du das zu einem Pointer castest kannst du sehr wohl darauf schreiben. Da der Compiler keine Jumptabelle o.ä. daraus basteln kann und auch nicht doppelte Werte ausschliessen kann, lässt er dies nicht zu. Der Compiler kann case-Statements nur erstellen, wenn alles zur Compilezeit bekannt ist. Vielleicht unverständlich aber ist leider einfach so ;)
Wenn du das ":Integer" weglässt sollte es aber klappen. Das ist dann eine "richtige" Konstante ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!