Error: Ordinal expression expected

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Silence
Beiträge: 2
Registriert: So 8. Mär 2015, 15:55

Error: Ordinal expression expected

Beitrag von Silence »

Hallo.
Ich habe ein Programm geschrieben, welches nach Eingabe eines Zeichens mir sagen soll, um was für ein Zeichen es sich handelt, dabei sollen zwischen großen/kleinen Vokalen, großen/kleinen Konsonanten, Ziffern, Umlauten und Sonderzeichen unterschieden werden. Als ich das Programm kompilieren wollte erschien jedoch die Fehlermeldung "Error: Ordinal expression expected".

Code: Alles auswählen

program Zeichenerkennung;
var Symbol:char;
 
 
begin
 
write ('Gib ein Zeichen ein: ');
readln (Symbol);
write ('Das Zeichen "',Symbol,'" ist ');
 
if Symbol in ['A','E','I','O','U']
then writeln ('ein großer Vokal.')
else if Symbol in ['a','e','i','o','u']
     then writeln ('ein kleiner Vokal.')
     else if Symbol in ['B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z']
          then writeln ('ein großer Konsonant.')
          else if Symbol in ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z']
               then writeln ('ein kleiner Konsonant.')
               else if Symbol in ['0'..'9']
                    then writeln ('eine Ziffer.')
                    else if Symbol in ['Ä','Ö','Ü']
                         then writeln ('ein großer Umlaut.')
                         else if Symbol in ['ä','ö','ü','ß']
                              then writeln ('ein kleiner Umlaut.')
                              else writeln ('ein Sonderzeichen.');
 
end.   


Was stimmt da nicht?

mfG Silence
Zuletzt geändert von Lori am Mo 9. Mär 2015, 18:02, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Error: Ordinal expression expected

Beitrag von theo »

Willkommen in der Welt von Unicode / UTF-8

Mach es auf diese Art, dann geht es:

Code: Alles auswählen

var Symbol:String;
begin
Symbol:='Ä';
case Symbol of
'A','E','I','O','U': writeln('ein großer Vokal.');
'0'..'9': writeln('eine Ziffer.');
'Ä','Ö','Ü': writeln ('ein großer Umlaut.')
end;


Grund ist: Lazarus arbeitet mit UTF-8, und da ist z.B. ein Umlaut kein Char (Byte) sondern besteht aus einer Folge von Bytes (String).

Silence
Beiträge: 2
Registriert: So 8. Mär 2015, 15:55

Re: Error: Ordinal expression expected

Beitrag von Silence »

Hey, danke für die Antwort, aber leider *muss* ich das Programm in der von mir geschrieben Form irgendwie verwenden, das wurde mir so vorgegeben. :/
Kann man das denn sonst gar nicht anders machen?

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Error: Ordinal expression expected

Beitrag von theo »

Silence hat geschrieben:Hey, danke für die Antwort, aber leider *muss* ich das Programm in der von mir geschrieben Form irgendwie verwenden, das wurde mir so vorgegeben. :/
Kann man das denn sonst gar nicht anders machen?

Dann erkläre deinem "Vorgeber" dass man das jetzt anders macht. :wink:

P.S. wenn es unbedingt sein muss (warum?), kann man schon was machen. Lies z.B. hier http://wiki.freepascal.org/FPC_Unicode_support

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Error: Ordinal expression expected

Beitrag von Jole »

Hallo,
also wenn Du das so machen must dann frag bei deinen Umlauten einfach den Ordinaltyp ab(wird ja schliesslich auch reklammiert).

Code: Alles auswählen

 
...
else if Ord(Symbol) in[142,153,154]
then WriteLn('ein großer Umlaut.')
else if Ord(Symbol) in[132,148,129]
then writeln ('ein kleiner Umlaut.')
...
 

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Error: Ordinal expression expected

Beitrag von theo »

Jole hat geschrieben:Hallo,
also wenn Du das so machen must dann frag bei deinen Umlauten einfach den Ordinaltyp ab(wird ja schliesslich auch reklammiert).

Nein, das geht nicht mit UTF-8

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Error: Ordinal expression expected

Beitrag von Jole »

theo hat geschrieben:
Jole hat geschrieben:Hallo,
also wenn Du das so machen must dann frag bei deinen Umlauten einfach den Ordinaltyp ab(wird ja schliesslich auch reklammiert).

Nein, das geht nicht mit UTF-8

Mit dem Programmschnipsel der da abgedruckt ist Funktioniert das einwandfrei, habs probiert.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Error: Ordinal expression expected

Beitrag von theo »

Jole hat geschrieben:Mit dem Programmschnipsel der da abgedruckt ist Funktioniert das einwandfrei, habs probiert.


Ein UTF-8 Umlaut passt nun mal nicht in ein Char. Da musst du was anderes getestet haben.

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Error: Ordinal expression expected

Beitrag von Jole »

theo hat geschrieben:
Jole hat geschrieben:Mit dem Programmschnipsel der da abgedruckt ist Funktioniert das einwandfrei, habs probiert.


Ein UTF-8 Umlaut passt nun mal nicht in ein Char. Da musst du was anderes getestet haben.

Ok, Du bist der Profi nicht ich, dann erklaer mir aber bitte mal warum dieser Code

Code: Alles auswählen

 
program project1;
var Symbol:char;
 
begin
 
write ('Gib ein Zeichen ein: ');
readln (Symbol);
write ('Das Zeichen "',Symbol,'" ist ');
 
if Symbol in ['A','E','I','O','U']
then writeln ('ein großer Vokal.')
else if Symbol in ['a','e','i','o','u']
then writeln ('ein kleiner Vokal.')
else if Symbol in ['B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z']
then writeln ('ein großer Konsonant.')
else if Symbol in ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z']
then writeln ('ein kleiner Konsonant.')
else if Symbol in ['0'..'9']
then writeln ('eine Ziffer.')
else if Ord(Symbol) in [142,153,154]
then writeln ('ein großer Umlaut.')
else if Ord(Symbol) in [132,148,129]
then writeln ('ein kleiner Umlaut.')
else writeln ('ein Sonderzeichen.');
  ReadLn;
end.
 

Funktioniert.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Error: Ordinal expression expected

Beitrag von theo »

Unter deutschem Windows mag das funktionieren, weil du einfach den Char von der Konsole einliest und dann mit einem bestimmten Zeichennummer aus einem bestimmten Zeichensatz vergleichst.
Unter modernem Linux geht das so nicht.
Silence hat ja nicht gesagt, für welches Betriiebssystem das laufen soll.

Aber es stimmt schon, dass es ein spezielles Problem ist, weil von Konsole gelesen werden muss.
Man könnte mit ConsoleToUTF8 arbeiten um eine Cross Platform Lösung zu haben.

Es gibt verschiedene Wege. Wie gesagt, hier gibt es darüber weitere Informationen:
http://wiki.freepascal.org/FPC_Unicode_support
http://wiki.freepascal.org/LCL_Unicode_Support/de

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Error: Ordinal expression expected

Beitrag von Jole »

theo, Du hast recht was die unterschiedlichen bedingungen angeht(Betriebsystem/Codepage etc) aber... egal welche bedingungen vorliegen, Umlaute sind in der form ['ä','ö','ü'] in Mengen nicht erlaubt(da hat auch Turbo Pascal schon reklamiert). Wenn Silence sein ergebnis so abfragen muss wie oben angegeben, dann bleibt im nichts anderes uebrig als fuer das jeweillige System die Codes zu ermitteln und diese ein zu setzen.
Ich finde der Leherer (oder wehr auch immer) haette das selber erst mal probieren sollen, bevor er solche Aufgaben verteilt.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Error: Ordinal expression expected

Beitrag von theo »

Jole hat geschrieben:Wenn Silence sein ergebnis so abfragen muss wie oben angegeben

Die Frage ist halt, was er eigentlich genau "muss". Darf er kein "Case" verwenden, muss er ein "Char" verwenden?
Bleibt die Frage warum.

Jole hat geschrieben:Ich finde der Lehrer (oder wer auch immer) haette das selber erst mal probieren sollen, bevor er solche Aufgaben verteilt.

Da hast du recht.

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Error: Ordinal expression expected

Beitrag von Warf »

Jole hat geschrieben:Ich finde der Leherer (oder wehr auch immer) haette das selber erst mal probieren sollen, bevor er solche Aufgaben verteilt.

vielleicht nutzt der Lehrer eine Version von Delphi, welche UTF8 Standardmäßig verwendet, und geht davon aus das es die Schüler auch Delphi nutzen, und der Schüler nutzt lieber Lazraus

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

Re: Error: Ordinal expression expected

Beitrag von wp_xyz »

Kein Delphi verwendet UTF8. Aber trotzdem hast du recht: Delphi ab, ich glaube, 2007 verwendet UTF16. Damit ist 'ä' z.B. wieder ein char, und die case-Abfrage geht in Ordnung (ich hab's mit XE2 getestet).

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Error: Ordinal expression expected

Beitrag von Jole »

wp_xyz hat geschrieben:Kein Delphi verwendet UTF8. Aber trotzdem hast du recht: Delphi ab, ich glaube, 2007 verwendet UTF16. Damit ist 'ä' z.B. wieder ein char, und die case-Abfrage geht in Ordnung (ich hab's mit XE2 getestet).

Geht nur die Abfrage in Ordnung oder wertet Delphi das auch aus? In Lazarus kann ich den Typ auch auf UTF8String einstellen, Kombilieren und Starten geht dann auch in Ordnung, Ausgewertet wird da aber nix!
Also das hier:

Code: Alles auswählen

 
program umlaut;
var
  Symbol: UTF8String;
 
begin
  Write('Zeichen eingeben ');
  ReadLn(Symbol);
 
  case Symbol of
    'ä': WriteLn('Klein');
  end;
 
  ReadLn;
end.
 

Geht, er gibt aber das ergebnis bei Eingabe von ä nicht aus.

Antworten