Mehrfache String Prüfung in Schleife

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Hartkern
Beiträge: 69
Registriert: Sa 5. Dez 2015, 20:03
OS, Lazarus, FPC: Win10 IDE 1.6
CPU-Target: 64Bit
Wohnort: Leipzig

Mehrfache String Prüfung in Schleife

Beitrag von Hartkern »

Hallo,
Ich versuche gerade in einem StringGrid eine Zelle auf ihren Inhalt zu prüfen..
Es sollen 3 Möglichkeiten geprüft werden:
Zelle ist leer
Zelle beinhaltet "simple"
Zelle beinhaltet "configurable"

Wie bekomme es hin daß man prüft "leer" ja - dann prüfe nächste Zelle und Fehlermeldung
Ist der String "simple" ja - nächste Zelle wenn
Nein!dann prüfe auf "configurable" passt eins von beiden dann okay ansonsten Fehlermeldung.

Aktuell prüfe ich es in einer For to Schleife..

Ich bekomme es nur hin erst auf Leer dann auf Simple und dann auf Configurable zu prüfen.. jedoch bekomme ich dann jeweils Fehlermeldung wenn der String nicht Simple ist aber Configurable und umgekehrt.

Grüße Sebastian

Winni
Beiträge: 266
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Mehrfache String Prüfung in Schleife

Beitrag von Winni »

Hi!

Lass Lazarus bzw. fpc die Arbeit machen .

Sei längerem gibt's ja auch case für strings.
Haben wir schließlich lang genug drauf gewartet.

Code: Alles auswählen

var msg: string;
....
Case StringGrid.Cells[aCol, aRow] of
      ''          : msg := 'nix'
     'simple' : msg := 'simple';
    'configurable': msg := 'conf';
    end; //case
showMessage (msg);
.....
 


Winni

Mathias
Beiträge: 4899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Mehrfache String Prüfung in Schleife

Beitrag von Mathias »

Habe ich da etwas verpasst, das die auf einmal geht ?
So wie ich mich erinnern mag, ging die nur mit Char und Integern.

Code: Alles auswählen

var
  s: String;
begin
  s := 'abc';
  case s of
    '':        WriteLn('nix');
    'simple':  WriteLn('simple');
    'abc':     WriteLn('abc');
  end;
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 1438
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Mehrfache String Prüfung in Schleife

Beitrag von Warf »

Mathias hat geschrieben:Habe ich da etwas verpasst, das die auf einmal geht ?
So wie ich mich erinnern mag, ging die nur mit Char und Integern.


Ja geht jetzt auch für Strings, aber nicht für andere typen (z.b. Double, auch wenn natürlich direkte Double vergleiche keinen Sinn machen). Ich bin natürlich kein FPC compiler entwickler, aber der grund (zumindest in C) warum nur ordinaltypen erlaubt sind, ist weil man damit die anweisung zu einer jumping table umbauen kann. Also:

Code: Alles auswählen

case i of:
1: //Code1;
2..3: //Code2;
5: //Code5;
end;

Wird zu:

Code: Alles auswählen

caseArray: Array[1..5] of Pointer = [@Case1, @Case2, @Case2, nil, @Case5];
goto caseArray[i];
Case1:
//Code1
goto CaseEnd
Case2:
//Code2
goto CaseEnd
Case5:
//Code5
CaseEnd:
...

Was natürlich einen extremen performance Vorteil im gegensatz zu if-then-else bringen kann, denn If-Then-else muss jede bedingung checken, das checkt keine einzige bedingung (Man tauscht Laufzeit gegen Speicher ein).
Daher können werte im case auch nur konstant sein.

Die Frage ist jetzt natürlich wie das im FPC mit strings umgesetzt wird. Es gibt zwei möglichkeiten, entweder das ist nur syntaktischer Zucker für ein If-Then-Else, in dem fall verstehe ich nicht warum es nur für strings geht und nicht für andere typen, oder es benutzt intern irgend eine schlaue datenstruktur wie eine vordefinierte Hashmap mit sprungaddressen, was zwar echt cool wäre, aber mir viel zu viel compiler magic wäre (ich weiß gerne was intern abgeht).

Auf jeden Fall kann mans aktuell für Strings benutzen, warum für andere Datentypen nicht, keine ahnung

Winni
Beiträge: 266
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.06, fpc 3.04
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Mehrfache String Prüfung in Schleife

Beitrag von Winni »

Hi!

Case für strings geht seit fpc version 2.6. Das war so etwa 2012.

Geht nur im modus FPC und OBJFPC - also nicht in mode Delphi oder ISO.

30 Jahre hab ich drauf gewartet - es wurde auch Zeit.
Wie die Implementierung aussieht, weiß ich nicht.

Winni

Antworten