Seite 1 von 2

Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 10.04.2025 14:00
von matbal
Beide Vergleiche unten im Code sollten doch das gleiche Ergebnis liefern!? Unter Linux bekomme ich unterschiedliche Ergebnisse:

Code: Alles auswählen

mark$ = Chr($ffff)

Debug Bool("zoo" < mark$)        ; = 0
Debug Bool("zoo" < Chr($ffff))   ; = 1

Re: Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 10.04.2025 14:14
von Macros
Was willst du denn erreichen? Tatsächlich steht in der Hilfe nicht ausdrücklich, dass man < und > nicht mit Strings verwenden sollte, doch ja das sollte man keinesfalls tun! Um Strings zu vergleichen gibt es nur = und <> (ungeleich).

Alle anderen Operatoren haben keinen Sinn, da sie sich nicht eindeutig definieren lassen. Mathematische Operationen sowieso nicht, aber bei String1 < String2 könnte man auch Verschiedenstes erwarten: Soll es wahr sein, wenn String 1 kürzer als String2 ist? Wenn String1 alphabetisch vor String2 sortiert würde? usw.

Eventuell kann man als Bug melden, dass der Compiler hier keinen Syntax Error wirft, wie bei binären Operatoren.

Nutze die Passende Funktion:
Willst du die Länge vergleichen nutze Len(String$).
Willst du die alphabetische Sortierung nutze ASC(String$) im Vergleich mit ASC(String2$). Bzw. besser: packe die Strings in eine Liste oder ein Array und nutze die Sortierfunktion von Purebasic SortList().

Re: Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 10.04.2025 16:03
von matbal
Ich denke schon, daß solche String-Vergleiche nötig sind, z.B. um eine bestimmte Zeile in einer sortierten Liste sehr schnell zu finden.

Auf das Problem beim String-Vergleich bin ich gestoßen, als ich ein Programm von Windows auf Linux portiert habe.

Im Prinzip habe ich ein Programm geschrieben, das eine Sortierfunktion für sehr große Wörterlisten enthält. Normales sortieren mit den PB-Funktionen ist sehr langsam und man sieht keinen Fortschritt. Deswegen teile ich die große Wörterliste in kleinere Häppchen. Die werden sortiert und temporär gespeichrt.

Anschließend werden alle Teile parallel verarbeitet. Ich hole aus jeder Datei ein Wort, das kleinste davon wird gespeichert an der stelle das nächste Wort geholt. Wenn das Ende eines Teils erreicht ist, schreibe ich meine Schluß-Markierung statt eines Wortes. Dieses Zeichen muß größer sein als jedes Word. Deshalb habe ich das größte Unicodezeichen gewählt. Dabei bin ich auf diesen Fehler gestoßen.

Ich habe jetzt einfach ein anderes Zeichen gewählt ($7FFF).

Re: Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 10.04.2025 18:47
von NicTheQuick
Um Strings zu vergleichen kann man CompareMemoryString() nutzen.
Und etwas abgewandelt kann man es auch für normale Strings nutzen:

Code: Alles auswählen

Procedure CompareString(a.s, b.s, mode.i = #PB_String_CaseSensitive)
	ProcedureReturn CompareMemoryString(@a, @b, mode)
EndProcedure

mark$ = Chr($ffff)

Debug Bool("zoo" < mark$)        ; = 0
Debug Bool("zoo" < Chr($ffff))   ; = 1
Debug Bool(CompareString("zoo", mark$) = #PB_String_Lower)
Debug Bool(CompareString("zoo", Chr($ffff)) = #PB_String_Lower)

Re: Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 10.04.2025 18:51
von STARGÅTE
Also in der PureBasic Dokumentation steht bei den Operatoren < und > tatsächlich, dass diese beim Vergleich von Strings case-sensitive sind, also nach Character-Code verglichen wird.
Ob man das nun nutzen möchte bleibt jedem selbst überlassen.

Diese Inkonsistenz sollte aber unter Linux behoben werden.
Allerdings gebe ich auch zu bedenken, dass $FFFF kein gültiges Zeichen ist. Im Unicode-Standard, werden $FFFF, $FFFE und $FEFF zur Unterscheidung von Little und Big-Endian genutzt.
Du kannst $FFFD nutzen.

Re: Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 10.04.2025 19:10
von NicTheQuick
Ich hab mal einen Bug Report erstellt: https://www.purebasic.fr/english/viewtopic.php?t=86717

Re: Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 10.04.2025 20:02
von Macros
STARGÅTE hat geschrieben: 10.04.2025 18:51 Also in der PureBasic Dokumentation steht bei den Operatoren < und > tatsächlich, dass diese beim Vergleich von Strings case-sensitive sind, also nach Character-Code verglichen wird.
Interessehalber: Wo?
Bei Variablen, Typen und Operatoren wo ich geschaut habe steht im Deutschen nur folgendes:
Bild

Aber ja, falls das vermerkt ist, dann sollte das Verhalten natürlich konsistent sein.

Re: Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 10.04.2025 20:26
von STARGÅTE

Re: Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 10.04.2025 21:47
von Macros
Danke, dann gibt es wohl noch einen Dokumentationsbug. Melde ich morgen.

Ich habe mir gerade nochmal die aktuelle Beta heruntergeladen und (zumindest unter Linux) ist es in der Hilfe im Editor im entsprechenden Kapitel nicht erwähnt, auch nicht auf Englisch. Die deutsche Onlinehilfe hingegen erwähnt es auch.

Re: Inkonsistentes Verhalten beim Stringvergleich

Verfasst: 12.04.2025 09:43
von HeX0R
Die meisten Sprachen unterstützen diese Stringvergleiche, und tatsächlich nutze ich das in PB seit Jahren.
Es ist praktisch, wenn man z.B. aus Versionsstrings nicht erst umständlich valide Zahlen herstellen möchte, z.B.:

Code: Alles auswählen

a$ = "1.00.123"
b$ = "1.01.000"
If b$ > a$
	Debug b$ + " > " + a$
EndIf
Erklärung: https://www.youtube.com/watch?v=qR4kyT58wLQ