Seite 1 von 1

Einfacher Vergleich von 2 Strings

Verfasst: 06.12.2004 02:25
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?

Verfasst: 06.12.2004 02:40
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

Verfasst: 06.12.2004 02:41
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?

Verfasst: 06.12.2004 02:49
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 :).

Verfasst: 06.12.2004 03:05
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.

Verfasst: 06.12.2004 04:25
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').

Verfasst: 06.12.2004 10:58
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.

Verfasst: 06.12.2004 11:12
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

Verfasst: 06.12.2004 13:12
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).

Verfasst: 06.12.2004 13:46
von ts-soft
IF While sollte eine Aufzählung sein
Da = nicht immer ein Zuordnungoperator ist, ist die Syntax für <, >, <>, = immer gleich.