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

Für Fragen von Einsteigern und Programmieranfängern...

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

Beitragvon Marsmännchen » 22. Feb 2017, 20:44 [gelöst]Warum ist const für Case kein const?

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 22. Feb 2017, 21:52, insgesamt 1-mal geändert.
Du kannst sicherlich auch mit C++, Java und C# programmieren... aber warum sollte man das machen???
Marsmännchen
 
Beiträge: 260
Registriert: 4. Mai 2014, 20:32
Wohnort: Berlin
OS, Lazarus, FPC: FreeBSD 11, FPC 3.0.2, Lazarus 1.6.2 | 
CPU-Target: 32bit
Nach oben

Beitragvon Bitschubser » 22. Feb 2017, 20:55 Re: Warum ist const für Case kein const?

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.
Bitschubser
 
Beiträge: 59
Registriert: 27. Aug 2012, 14:43

Beitragvon wp_xyz » 22. Feb 2017, 21:00 Re: Warum ist const für Case kein const?

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.
wp_xyz
 
Beiträge: 1785
Registriert: 8. Apr 2011, 08:01

Beitragvon Marsmännchen » 22. Feb 2017, 21:32 Re: Warum ist const für Case kein const?

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:
Du kannst sicherlich auch mit C++, Java und C# programmieren... aber warum sollte man das machen???
Marsmännchen
 
Beiträge: 260
Registriert: 4. Mai 2014, 20:32
Wohnort: Berlin
OS, Lazarus, FPC: FreeBSD 11, FPC 3.0.2, Lazarus 1.6.2 | 
CPU-Target: 32bit
Nach oben

Beitragvon Socke » 22. Feb 2017, 21:42 Re: Warum ist const für Case kein const?

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
Socke
 
Beiträge: 2314
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Marsmännchen » 22. Feb 2017, 21:52 Re: Warum ist const für Case kein const?

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
Du kannst sicherlich auch mit C++, Java und C# programmieren... aber warum sollte man das machen???
Marsmännchen
 
Beiträge: 260
Registriert: 4. Mai 2014, 20:32
Wohnort: Berlin
OS, Lazarus, FPC: FreeBSD 11, FPC 3.0.2, Lazarus 1.6.2 | 
CPU-Target: 32bit
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried