[gelöst]Warum ist const für Case kein const?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

[gelöst]Warum ist const für Case kein const?

Beitrag von Marsmännchen »

Hi,

ich verzweifel gerade an einer völlig banalen Übungsaufgabe. Ich habe folgenden Code:

Code: Alles auswählen

 
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:
WoWTextadventure.lpr(54,37) Error: Constant Expression expected


Nach meinem bisherigen Verständis [i]ist[/i eine Konstante eine Konstante. Wo ist mein Denkfehler?]
Zuletzt geändert von Marsmännchen am Mi 22. Feb 2017, 21:52, insgesamt 1-mal geändert.
Ich mag Pascal...

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: Warum ist const für Case kein const?

Beitrag von Bitschubser »

Marsmännchen hat geschrieben:

Code: Alles auswählen

 
const
  Breite : Integer = 17;
  HaelfteBreite : Integer = 8;
  Hoehe : Integer = 8;
  LetzteReihe : Integer = 16;
 



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.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Warum ist const für Case kein const?

Beitrag von wp_xyz »

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.

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Warum ist const für Case kein const?

Beitrag von Marsmännchen »

Sowas Blödes :oops:

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.

Danke :oops:
Ich mag Pascal...

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Warum ist const für Case kein const?

Beitrag von Socke »

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:

Code: Alles auswählen

const LetzteReihe = Integer(16);
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Warum ist const für Case kein const?

Beitrag von Marsmännchen »

Socke hat geschrieben:Du kannst aber einen vorgeben:

Code: Alles auswählen

const LetzteReihe = Integer(16);


Das war genau das, was ich brauchte :D
Dankeschön
Ich mag Pascal...

Antworten