Inkonsistentes Verhalten beim Stringvergleich

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Inkonsistentes Verhalten beim Stringvergleich

Beitrag 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
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Inkonsistentes Verhalten beim Stringvergleich

Beitrag 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().
Bild
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Inkonsistentes Verhalten beim Stringvergleich

Beitrag 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).
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Inkonsistentes Verhalten beim Stringvergleich

Beitrag 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)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Inkonsistentes Verhalten beim Stringvergleich

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Inkonsistentes Verhalten beim Stringvergleich

Beitrag von NicTheQuick »

Ich hab mal einen Bug Report erstellt: https://www.purebasic.fr/english/viewtopic.php?t=86717
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Inkonsistentes Verhalten beim Stringvergleich

Beitrag 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.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Inkonsistentes Verhalten beim Stringvergleich

Beitrag von STARGÅTE »

PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Inkonsistentes Verhalten beim Stringvergleich

Beitrag 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.
Bild
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Inkonsistentes Verhalten beim Stringvergleich

Beitrag 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
Antworten