AutoIT Bug? Rechenfehler? Denkfehler??? Was läuft hier schief?

  • Guten Morgen allerseits!

    In einem etwas grösseren Script muss ich X/Y Koordinaten vergleichen und entsprechend auswerten. Leider ergeben bestimmte Werte falsche Ergebnisse.
    Da es sich um Bildschirmkoordinaten handelt, sind Dezimalstellen nicht von Bedeutung. Es handelt sich nur um ganzahlige bzw gerundete Werte.
    Hier der relevante Teil:

    [autoit]

    Local $ergebnis
    Do
    $x = InputBox("X","Ergebnis der letzten Eingabe:" & @CR & @CR & $ergebnis)
    $y = InputBox("Y","Ergebnis der letzten Eingabe:" & @CR & @CR & $ergebnis)

    [/autoit][autoit][/autoit][autoit]

    If $y > $x Then
    $ergebnis = $y & " > " & $x
    ElseIf $x > $y Then
    $ergebnis = $x & " > " & $y
    Else
    $ergebnis = $x & " = " & $y
    EndIf
    Until @error = 1 or $y = ""

    [/autoit]

    Folgende Sequenz finde ich mehr als seltsam:
    X=10, Y=100 -> 100 > 10
    X=10, Y=101 -> 101 > 10
    X=11, Y=101 -> 11 > 101 ???
    ...
    X=11, Y=109 -> 11 > 109 ???
    X=11, Y=110 -> 110 > 11

    Das gleiche passiert zB auch bei 10000 > 1000 und 1001 > 10000 usw...

    Es scheint fast so, als würde die Kommastelle der grösseren Zahl um eins nach links versetzt werden, bzw als würde nur die gleiche Anzahl der Stellen verglichen werden.
    Also 11 und 101 wird zu 11 und 10.1 bzw 11 und 101 wird zu 11 und 10.

    Fügt man in Zeile 5 folgenden Befehl ein, funktioniert das Script (zumindest soweit ich gestestet habe):

    [autoit]

    $x = Round($x, StringLen($y))

    [/autoit]


    Komplett also so:

    [autoit]

    Local $ergebnis
    Do
    $x = InputBox("X", "Ergebnis der letzten Eingabe:" & @CR & @CR & $ergebnis)
    $y = InputBox("Y", "Ergebnis der letzten Eingabe:" & @CR & @CR & $ergebnis)
    $x = Round($x, StringLen($y)) ;==> hier bekommt $x die gleiche Anzahl an Stellen wie $y --- das kann doch nicht die Lösung sein, oder?
    If $y > $x Then
    $ergebnis = $y & " > " & $x
    ElseIf $x > $y Then
    $ergebnis = $x & " > " & $y
    Else
    $ergebnis = $x & " = " & $y
    EndIf
    Until @error = 1 Or $y = ""

    [/autoit]


    Da muss es doch eine Einstellung geben, um dieses Verhalten zu umgehen...

    p.s.: Ich hoffe, ich blamiere mich jetzt hier nicht bis auf die Knochen, weil ich irgendwas vollkommen offensichtliches übersehen habe... ;(

  • Der Rückgabewert einer Inputbox ist vom Typ "String" und muss zuerst ein eine Zahl umgewandelt werden (z.B.: Number, Int, Round).

    [autoit]

    Local $ergebnis
    Do
    $x = Number(InputBox("X", "Ergebnis der letzten Eingabe:" & @CR & @CR & $ergebnis))
    $y = Number(InputBox("Y", "Ergebnis der letzten Eingabe:" & @CR & @CR & $ergebnis))

    [/autoit][autoit][/autoit][autoit]

    If $y > $x Then
    $ergebnis = $y & " > " & $x
    ElseIf $x > $y Then
    $ergebnis = $x & " > " & $y
    Else
    $ergebnis = $x & " = " & $y
    EndIf
    Until @error = 1 Or $y = ""

    [/autoit]

    E

  • Wow! Das war mal ne schnelle Antwort! Tausend Dank dafür 8o

    Die Koordinaten werden im richtigen Skript zwar nicht mit einer Inputbox ermittelt, aber die Funktion, die das macht, gibt tasächlich Strings aus, ohne dass mir das bewußt war...

    Dann war das mit Round ja ein echter Zufallstreffer, weil ich damit ja was Anderes erreichen wollte, als den Variablentyp zu ändern :rock: