Fehlermeldung bei in [gelöst}

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Fehlermeldung bei in [gelöst}

Beitragvon haderlump » 16. Mai 2019, 05:26 Fehlermeldung bei in [gelöst}

Hallo zusammen
ich habe folgende Zeile eingegeben
Code: Alles auswählen
if (kontakt_[a].zweck in ['be','ba'])  then  .....

Dabei ist kontakt_[a].zweck vom typ string.
Beim Compilieren kommt die Fehlermeldung "Error: ordinal expression expected"

Was mache ich da falsch. Geht das nicht mit Stringmengen?

Gruß Fritz
Zuletzt geändert von haderlump am 18. Mai 2019, 04:06, insgesamt 1-mal geändert.
haderlump
 
Beiträge: 167
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon six1 » 16. Mai 2019, 05:59 Re: Fehlermeldung bei in

nein, es muss ein ordinaler Typ sein. -> int, char ...

Du könntest String-Untermengen aber über pos finden:

Code: Alles auswählen
if pos(kontakt_[a].zweck,'be ba')>0  then ...
Gruß, Michael
six1
 
Beiträge: 140
Registriert: 1. Jul 2010, 18:01

Beitragvon fliegermichl » 16. Mai 2019, 09:20 Re: Fehlermeldung bei in

Wie six1 schon schreibt, geht das in nur mit ordinalen Typen.

Aber dazu gehören auch Sets
Code: Alles auswählen
 
type
 TMyItem = (ab, be, cd, ef, xy, usw, unknown);
 TMyItems = set of TMyItem;
 
const
 MyItemString : array[TMyItem] of string = ('ab', 'be', 'cd', 'ef', 'xy', 'usw', 'unknown');
 
function checktype(which : TMyItems) : boolean;
var Item : TMyItem;
begin
 for Item := ab to unknown do if kontakt_[a].zweck = MyItemString[Item] then Break;
 Result := Item <> unknown;
 if Result then Result := Item in which; // Hier geht das
end;
 


Die Funktion checktype wird dann so aufgerufen
Code: Alles auswählen
 
 if checktype([ab, be]) then MachDies else
 if checktype([xy, usw]) then MachJenes else
 Machsonstwas;
 
fliegermichl
Lazarusforum e. V.
 
Beiträge: 452
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Socke » 17. Mai 2019, 08:29 Re: Fehlermeldung bei in

Das Konstrukt ['be','ba'] definiert eine Menge, die nur ordinale Typen enthalten kann.
Stattdessen muss man bei Strings mit Arrays oder Listen arbeiten.

Für Arrays kann man sich seinen eigenen operator schreiben oder mit TypeHelpern arbeiten.
Code: Alles auswählen
program Project1;
 
{$mode objfpc}{$H+}
{$ModeSwitch typehelpers}
 
type
  TStringArray = array of string;
 
  { TStringArrayHelper }
  TStringArrayHelper = type helper for TStringArray
    function contains(const s: String): Boolean;
  end;
 
const
  MyItemString : array[0..6] of string = ('ab', 'be', 'cd', 'ef', 'xy', 'usw', 'unknown');
 
operator in(const s: String; a: array of String): Boolean;
var
  i: Integer;
begin
  for i := low(a) to high(a) do
    if a[i] = s then exit(True);
 
  Result := False;
end;
 
{ TStringArrayHelper }
 
function TStringArrayHelper.contains(const s: String): Boolean;
begin
  Result := s in Self;
end;
 
 
begin
 writeln('ab' in MyItemString);
 // ab FPC 3.0 kann man den Array auch on the fly erstellen
 writeln('ab' in TStringArray.Create('ab', 'cd'));
 // mit TypeHelper
 Writeln(TStringArray.Create('ab', 'cd').contains('ab'));
 readln;
end.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
Lazarusforum e. V.
 
Beiträge: 2661
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon haderlump » 18. Mai 2019, 04:06 Re: Fehlermeldung bei in

Danke für die Antwordten.
Ich hab wieder auf die guten alten If-Anfragen zurück gegriffen.
Die hatte ich schon, und musste sie nur aus dem Backup raus kopieren.

Gruß Fritz.
haderlump
 
Beiträge: 167
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon theo » 18. Mai 2019, 08:47 Re: Fehlermeldung bei in

haderlump hat geschrieben:Danke für die Antwordten.
Ich hab wieder auf die guten alten If-Anfragen zurück gegriffen.
Die hatte ich schon, und musste sie nur aus dem Backup raus kopieren.

Gruß Fritz.


Ein bisschen eleganter wäre "case":

Code: Alles auswählen
var
  s: String;
begin
  s := 'ba';
  case s of
    'be', 'ba': Caption := 'yes';
    else Caption := 'no';
  end;
end
theo
 
Beiträge: 8238
Registriert: 11. Sep 2006, 18:01

Beitragvon fliegermichl » 18. Mai 2019, 09:12 Re: Fehlermeldung bei in

theo hat geschrieben:Ein bisschen eleganter wäre "case":


Hihi, da habe ich vor einiger Zeit behauptet, daß das gar nicht geht in Pascal und musste dann feststellen, daß das in FPC tatsächlich implementiert wurde.
Der Compiler macht am Ende aber den gleichen Code wie if then else draus.
fliegermichl
Lazarusforum e. V.
 
Beiträge: 452
Registriert: 9. Jun 2011, 08:42
Wohnort: Echzell
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon theo » 18. Mai 2019, 12:06 Re: Fehlermeldung bei in

Gibt es seit FPC 2.6.0
fliegermichl hat geschrieben:Der Compiler macht am Ende aber den gleichen Code wie if then else draus.

Das ist ja nicht schlecht. Es ist aber eleganter zu schreiben und zu lesen.
theo
 
Beiträge: 8238
Registriert: 11. Sep 2006, 18:01

• Themenende •

Zurück zu Freepascal



Wer ist online?

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

porpoises-institution
accuracy-worried