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 ;)