Einfacher Vergleich von 2 Strings

Für allgemeine Fragen zur Programmierung mit PureBasic.
Heroglyph
Beiträge: 41
Registriert: 22.11.2004 20:34

Einfacher Vergleich von 2 Strings

Beitrag von Heroglyph »

Hi,
nachdem ich jetzt einige Stunden an einem wirklich simplen Problem saß und mir nicht erklären konnte, warum mein Code nicht funzte, kam ich auf die Idee zu überprüfen, ob sich bei zwei Strings feststellen lässt, welches der größere von beiden ist.

Das ist dabei rausgekommen:

Code: Alles auswählen

MessageRequester("Info",Str("a">"b"))
Was soll das sein?
Boolean?

Was mache ich falsch?
God is real, unless declared integer.
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

meinst du den vergleich von zahlen?!

Code: Alles auswählen

A = 20
B = 10

If A > B
  Debug "A:"+Str(A)+" ist grösser als "+"B:"+Str(B)
ElseIf A < B
  Debug "A:"+Str(A)+" ist kleiner als "+"B:"+Str(B)
ElseIf A = B
  Debug "A:"+Str(A)+" ist gleich "+"B:"+Str(B)
EndIf
steht alles in der hilfe drin, unter "Variablen, Typen und Operatoren".

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Boolean lässt sich bisher kaum anwenden in PB. Wenn du aber die Größe 2er Strings vergleichen willst, könntest du das über den Befehl len() machen, welcher als Rückgabewert die Länge des Strings hat. ;) Diese Rückgabewerte könntest du vergleichen.
Zum Verlgleich von Strings -> Wie wäre es mit CompareMemory() oder CompareMemoryString()? Damit ließe sich der Inhalt einer Speicheradresse bzw. der Inahlt zweier Strings vergleichen. Ob sie gleich oder ungleich sind.

//EDIT:
meinst du den vergleich von zahlen?!
Ich glaube, wenn er Strings sagt, meint er auch Strings und keine Zahlen... :wink:
Nur bei Strings kann man imo sowieso keine Boolschen Vergleiche machen, da Strings ja genaugenommen Pointer zum Speicher des Inhalts sind. Wie soll man diese auf Größer - Kleiner vergleichen?
Heroglyph
Beiträge: 41
Registriert: 22.11.2004 20:34

Beitrag von Heroglyph »

Lol.
Strings zu vergleichen ist eigentlich Standard und braucht man auch ziemlich häufig, um Wörter alphabetisch zu sortieren.
Sogar das alte Turbo Pascal kann Strings nativ vergleichen.

Mit CompareMemoryString() könnte das zumindest was werden, weil das ja auch eine gewisse Art von größer-kleiner-Beziehung zurückgibt (zumindest für das Beispiel funzt das dann zum Glück).
Danke :).
God is real, unless declared integer.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Heroglyph hat geschrieben:Lol.
Strings zu vergleichen ist eigentlich Standard und braucht man auch ziemlich häufig, um Wörter alphabetisch zu sortieren.
Sogar das alte Turbo Pascal kann Strings nativ vergleichen.

Mit CompareMemoryString() könnte das zumindest was werden, weil das ja auch eine gewisse Art von größer-kleiner-Beziehung zurückgibt (zumindest für das Beispiel funzt das dann zum Glück).
Danke :).
Ich hab dir doch gesagt dass man zum Längenvergleich einfach len() benutzen kann. Hier mal ein Beispiel (PB bietet einige Methden um Strings zu bearbeiten / zu vergleichen):

Code: Alles auswählen

string1$ = "12366"
string2$ = "1234"

If Len(string1$) > Len(string2$)
  message$ = "Der String1 mit dem Inhalt: " + string1$ + " ist länger."
ElseIf Len(string1$) < Len(string2$)
  message$ = "Der String2 mit dem Inhalt: " + string2$ + " ist länger."
Else
  message$ = "Beide Strings sind gleichlang"
EndIf

MessageRequester("Titel", message$)

//EDIT: Bevor du jetzt fragst, warum hier der Größenvergleich geht, (ist ja auch Boolscher Vergleich) kann ich dir sagen, ist eine Ausnahme.^^
Naja, also so wie in meinem Beispiel geht es schon, aber normalerweise bereitet das dem Compiler Probleme:

Code: Alles auswählen

a = 4
b = 2
Debug (a<b)

Debug (4<2)
Eigentlich sollte auch hier beide Male 0 rauskommen, tut es aber nicht, weil diese Boolschen vergleiche scheinbar nur anständig gehen wenn man direkte Werte einsetzt oder den Boolschen Vergleich in eine IF-Abfrage setzt. (oben im Beispiel geht es weil direkt die Zahlen als Rückgabewerte in die IF-Abfrage eingesetzt werden. Warum das so ist, keine Ahnung)...
Nur, einfach so einen Boolschen Ausdruck, damit hat PB Probleme. Also besser nur in Verbindung mit einer IF-Abfrage einsetzen.
Heroglyph
Beiträge: 41
Registriert: 22.11.2004 20:34

Beitrag von Heroglyph »

Es ist sehr nett von dir, dass du mir boolische Vergleiche näherbringen willst, aber ich habe auch schon eins zweimal programmiert und weiß daher, wie das funktioniert :).
Würde ich die Länge vergleichen wollen, hätte ich es exakt so gemacht, wie du gesagt hast, aber ich wollte die Strings vergleichen und nicht deren Länge (die ja offensichtlich Zahlen sind).

Hier ein Turbo Pascal Beispiel, was ich meine:

Code: Alles auswählen

Program Vergleich;
uses crt;
begin
  if 'a'>'b' then writeln('a ist größer b') else writeln('b ist größer a');
  readkey;
end.
Dieses Beispiel könnte man jetzt noch erweitern und erst sinnvoll machen, zu sowas wie:

Code: Alles auswählen

  if 'Rosa Kaninchen'>'Eichhörnchen' then ... else...
Dabei gehts nicht um die Länge, sondern einfach um den "Wert" des Wortes (und der sagt 'a' kommt vor 'b' und 'Eichhörnchen' kommt vor 'Rosa Kaninchen').
God is real, unless declared integer.
Benutzeravatar
Rob
Shadow Admin
Beiträge: 258
Registriert: 26.08.2004 01:39
Kontaktdaten:

Beitrag von Rob »

Aso. Kommt es dabei auf die Reihenfolge der Buchstaben an (also "ab" kleiner als "ba")? Egal wie, vergleich doch einfach die ASCII-Codes (Asc("a"), ...). Weiter vorne im Alphabet -> kleinerer ASCII-Code.
Build a man a fire and he's warm for a day. Set a man on fire and he's warm for the rest of his life
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Boolesche Vergleiche mit Basic sind immer mit "If While ..." einzuleiten, da eine Unterscheidung von Zuweisungsoperator bzw. Vergleichsoperator nur so von Basic erkannt werden.

Code: Alles auswählen

testvar1.s = "a"
testvar2.s = "b"
If testvar1 > testvar2
  MessageRequester("Test", "a > b")
Else
  MessageRequester("Test", "a < b")
EndIf
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Heroglyph
Beiträge: 41
Registriert: 22.11.2004 20:34

Beitrag von Heroglyph »

@Rob: Ja, klar kommt es dabei auf den Inhalt an, weil die Wörter ja größenmäßig so angeordnet sein sollen, wie beispielsweise in jedem Telefonbuch (und da ist es dann schon interessant, für die Position dort, ob man "Meier" oder "Emier" heißt :D).
Jede Routine, die ich dafür schreiben könnte wäre auch langsamer als ein interner Vergleich (wesentlich, da "Meier" auch vor "Meiera" kommen muss).

@ts-soft: Aha, so funktioniert's also auch in PureBasic, vielen Dank :).
Ach ja, was soll die Konstruktion "If While"?
Und die Erklärung leuchtet mir auch nicht recht ein (">" ist immer ein Ordnungsoperator).
God is real, unless declared integer.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

IF While sollte eine Aufzählung sein
Da = nicht immer ein Zuordnungoperator ist, ist die Syntax für <, >, <>, = immer gleich.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten