Fehlermeldung bei in [gelöst}

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Fehlermeldung bei in [gelöst}

Beitrag von haderlump »

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 Sa 18. Mai 2019, 05:06, insgesamt 1-mal geändert.

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Fehlermeldung bei in

Beitrag von six1 »

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

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Fehlermeldung bei in

Beitrag von fliegermichl »

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;
 

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: Fehlermeldung bei in

Beitrag von Socke »

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

haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Re: Fehlermeldung bei in

Beitrag von haderlump »

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.

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

Re: Fehlermeldung bei in

Beitrag von theo »

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

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Fehlermeldung bei in

Beitrag von fliegermichl »

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.

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

Re: Fehlermeldung bei in

Beitrag von theo »

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.

Antworten