var
Name : String;
Befehl : String;
Bestaetigung : Char;
NachNorden : Byte;
i,j : Integer;
const
Breite : Integer = 17;
HaelfteBreite : Integer = 8;
Hoehe : Integer = 8;
LetzteReihe : Integer = 16;
begin
NachNorden := 0;
... {hier uninteressanter Code (für mein Problem)}
Repeat
Readln(Befehl);
case UpperCase(Befehl) of
'N':
begin
Writeln('Du gehst nach Norden');
Inc(NachNorden);
if NachNorden >= 4 then
begin
for i := 1 to Hoehe do
begin
for j := 1 to Breite do
begin
Case i of
1:
if (j = 0) or (j = HaelfteBreite)
or (j = breite -1) then
Write('*');
LetzteReihe: {und hier nörgelt der Compiler}
Write(8);
otherwise
if (j < i) or
((j > HaelfteBreite-i) and (j < HaelfteBreite+i)) or
(j >= Breite-i) then
Write(0)
else
Write(' ');
end;
end;
Writeln;
end;
end;
Writeln;
end;
Der Compiler mault, wenn ich in einem Case-Konstrukt eine zuvor definierte Konstante verwende:
Was du da hast sind typisierte Konstanten.
Je nach Compiler-Modus (Delphi / nicht Delphi) sind typisierte Konstanten aber eingentlich initialisierte Variablen - d.h. sie lassen sich zur Laufzeit ändern.
Der Compiler braucht aber für Case etwas das schon zur Compile-Zeit feststeht.
Den Typ bei den Konstanten einfach wegzulassen sollte in jedem Fall helfen.
Ob typisierte Konstanten in Case funktionieren wenn der Compile-Modus nicht Delphi ist musst Du mal probieren.
Das Konstrukt wie "const LetzteReihe: Integer = 16" stammt aus Turbo-Zeiten, wo das die einzige Möglichkeit war, eine Variable zu initialisieren. Mit {$writeableconst off} kannst du das Verhalten ausschalten, und du kannst den Wert nicht mehr ändern. Zum Initialisieren von Variablen ist "var LetzteReihe: Integer = 16" meiner Meinung nach die logischere Syntax.
Ich habe die Typen eingeführt, weil ich Konvertierungsprobleme mit meinen Konstanten hatte. Ohne Typangabe nimmt der Compiler SmallInt als Typ. Nachdem ich jetzt die Typen wieder weggenommen habe, funzt es.
Marsmännchen hat geschrieben:Ich habe die Typen eingeführt, weil ich Konvertierungsprobleme mit meinen Konstanten hatte. Ohne Typangabe nimmt der Compiler SmallInt als Typ. Nachdem ich jetzt die Typen wieder weggenommen habe, funzt es.
Der Compiler nimmt immer den kleinsten passenden Datentypen.
Du kannst aber einen vorgeben: