Enumerator Type: Ordinal expression expected

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
mczero80
Beiträge: 5
Registriert: Fr 14. Nov 2014, 10:42
OS, Lazarus, FPC: Windows 7, manchmal zwangsweise Win8, Lubuntu
CPU-Target: 32/64Bit
Wohnort: Delmenhorst
Kontaktdaten:

Enumerator Type: Ordinal expression expected

Beitrag von mczero80 »

Moin!

Nachdem ich mich ein wenig im Vorstellungsthread vorgestellt habe, hier meine Frage.

Ich habe folgendes Konstrukt, welches einem Delphi Projekt entstammt, und nun unter Lazarus laufen soll:

Code: Alles auswählen

 
function bestcharset(s: string): string;
const
  valid = [#32..#127, 'Ä', 'Ü', 'Ö', 'ß', 'ä', 'ü', 'ö', #10, #13];
var
  i, j,
    invalid: integer;
  temp: string;
begin
  invalid := 0;
  for i := 1 to Length(s) do
    if not (s[i] in valid) then Inc(invalid);
  for i := 1 to Length(temp) do
    if not (temp[i] in valid) then dec(invalid);
  if invalid > 0 then { OemToAnsiStr war erfolgreich ... }
  else temp := s;
  j := 0;
  SetLength(Result, Length(temp));
  for i := 1 to Length(temp) do
    if s[i] in valid then
    begin
      Inc(j);
      Result[j] := s[i];
    end;
  SetLength(Result, j);
end;
 
Leider quittiert Lazarus den Enumeratortyp valid mit einem Fehler:
ReadDiskUnit.pas(846,23) Error: Ordinal expression expected

Ich bin trotz der umfangreichen Dokumentation von FP/Lazarus nicht weiter gekommen. Ich habe diverse Konstrukte ausprobiert.

Wie sollte die Aufzählung deklariert werden, damit sie kompiliert?
Wahrscheinlich wird die o.g. Funktion im Zuge der UTF8 Umstellung hinfällig, aber erstmal will ich das ganze Projekt erstmal zum kompilieren bekommen...und mich ärgert es, an solchen Kleinigkeiten zu scheitern.

Danke im Voraus!
Zuletzt geändert von Lori am Fr 14. Nov 2014, 18:04, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

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

Re: Enumerator Type: Ordinal expression expected

Beitrag von theo »

Das hat bereits damit zu tun.
Lazarus arbeitet mit UTF-8 und Zeichen wie ä oder ß sind bereits nicht mehr Chars sondern Strings.
Nur Zeichen kleiner #128 können als Char behandelt werden.

Hier ist Umdenken angesagt. Vllt. benötigst du die Fkt "bestcharset" gar nicht mehr?

soerensen3
Beiträge: 104
Registriert: Fr 22. Jun 2012, 01:51
OS, Lazarus, FPC: Fedora-Linux 23 (Korora) Lazarus 1.6 FPC 3.0
CPU-Target: 64Bit
Wohnort: Bonn

Re: Enumerator Type: Ordinal expression expected

Beitrag von soerensen3 »

Hallo mczero80,

Das was du meinst ist kein enum sondern ein Set (kapitel 12.3: ftp://ftp.freepascal.org/pub/fpc/docs-pdf/ref.pdf) und ist vom Syntax her korrekt, das Problem sind wieder mal die Umlaute, die nicht in einem Byte darstellen lassen.

Leider weiß ich auch keine Lösung.

Generell ist es immer gut, die Zeile in der der Fehler auftritt anzugeben, dann ist der Fehler ersichtlicher. Außerdem kannst du als Highlighter im Forum auch fpc auswählen.

Gruß Johannes

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

Re: Enumerator Type: Ordinal expression expected

Beitrag von theo »

soerensen3 hat geschrieben: Leider weiß ich auch keine Lösung.
Es gibt sicher Lösungen, nur muss man zuerst nochmal überlegen, was der Sinn der Sache ist.
Es ist nicht auszuschließen, dass die ganze Idee in einer Unicode Umgebung hinfällig wird.

mczero80
Beiträge: 5
Registriert: Fr 14. Nov 2014, 10:42
OS, Lazarus, FPC: Windows 7, manchmal zwangsweise Win8, Lubuntu
CPU-Target: 32/64Bit
Wohnort: Delmenhorst
Kontaktdaten:

Re: Enumerator Type: Ordinal expression expected

Beitrag von mczero80 »

Danke erstmal!

Stimmt, es ist ein Set und kein Enumerator. Ich bin bisher immer ohne solche Konstrukte ausgekommen, daher habe ich mich noch nicht weiter damit beschäftigt :P
Es ist auch ein Lernprojekt quasi.

Der Fehler tritt direkt bei der Deklaration auf, also in

Code: Alles auswählen

valid = [#32..#127, 'Ä', 'Ü', 'Ö', 'ß', 'ä', 'ü', 'ö', #10, #13];

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

Re: Enumerator Type: Ordinal expression expected

Beitrag von theo »

mczero80 hat geschrieben: Der Fehler tritt direkt bei der Deklaration auf, also in

Code: Alles auswählen

valid = [#32..#127, 'Ä', 'Ü', 'Ö', 'ß', 'ä', 'ü', 'ö', #10, #13];
Ich glaube das hatten alle verstanden.
Hast du dir nochmal Gedanken gemacht, ob und wie du die Funktion in einer Unicode Umgebung noch benötigst?

mczero80
Beiträge: 5
Registriert: Fr 14. Nov 2014, 10:42
OS, Lazarus, FPC: Windows 7, manchmal zwangsweise Win8, Lubuntu
CPU-Target: 32/64Bit
Wohnort: Delmenhorst
Kontaktdaten:

Re: Enumerator Type: Ordinal expression expected

Beitrag von mczero80 »

Theo, Du hast recht. Alte Zöpfe muss man abschneiden. Die Funktion wurde verwendet, um einen String der in einem Datenbankfeld landen soll, von nicht-ASCII, also ANSI Zeichen zu befreien. Da ich auf SQLite umstelle, und froh bin, den ganzen BDE-Kram damit loszuwerden, brauche ich das nicht mehr. Soweit ich das gelesen habe, verwendet die SQLite Komponente aus der Component Library von Haus aus UTF8.

Wie solche kleinen Probleme, die einen ärgern, doch manchmal vom produktiven Denken abhalten können :)

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Enumerator Type: Ordinal expression expected

Beitrag von Michl »

Code: Alles auswählen

var
  i, j,
    invalid: integer;
  temp: string;
begin
  invalid := 0;
  for i := 1 to Length(s) do
    if not (s[i] in valid) then Inc(invalid);
  for i := 1 to Length(temp) do  //diese Zeile ist sinnfrei, da temp zuvor erst deklariert wurde und immer leer ist
    if not (temp[i] in valid) then dec(invalid);
oder

Code: Alles auswählen

  if invalid > 0 then { OemToAnsiStr war erfolgreich ... }  
  else temp := s; 
  j := 0;
  SetLength(Result, Length(temp));
hätte bestimmt eher so aussehen können

Code: Alles auswählen

  if invalid = 0 then { OemToAnsiStr war erfolgreich ... }
  begin
    Result:=s;
    Exit;
  end;
 
  temp := s;  //wobei das temp auch komplett weggelassen hätte werden können und s dafür verwendet
  SetLength(Result, Length(temp));
  ... 
Ich kenne das Projekt nicht, doch wenn ich die paar Zeilen sehe, wirst Du wohl noch an der einen oder anderen Stelle Deine Freude haben :wink:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mczero80
Beiträge: 5
Registriert: Fr 14. Nov 2014, 10:42
OS, Lazarus, FPC: Windows 7, manchmal zwangsweise Win8, Lubuntu
CPU-Target: 32/64Bit
Wohnort: Delmenhorst
Kontaktdaten:

Re: Enumerator Type: Ordinal expression expected

Beitrag von mczero80 »

Oh ja, und den Spaß hatte ich schon. Mich wurmt es am meisten, das ich erstmal die vielen Fehler/Inkompatibilitäten beseitigen muss, bevor ich das Ding kompilieren kann, und eigenen Code noch gar nicht, oder nur umständlich testen zu können. Sicher habe ich auch schon einigen Schrott eingeworfen. Ich gebe mein Bestes 8)

Eine Assemblerroutine war auch drin, die ich rausgeschmissen habe. Bewundernswert, aber eben nur auf x86 lauffähig.

Ich habe ja schon so ein wenig Bedenken, bei dem ganzen ASCII/UTF8/WideString Chaos den Überblick zu verlieren, bzw. das dadurch entstandene Bugs erst sehr spät entdeckt werden. Vielleicht sollte ich bisschen Unittesting machen wenn es reif dafür ist.

Antworten