Operation Ungleich, was mache ich falsch

  • Hallo,
    Ich habe die Operation ungleich benutzt und irgenwie funktioniert es nicht.

    [autoit]

    While 1
    $Zahl1 = Random(1, 3, 1)
    $Zahl2 = Random(1, 3, 1)
    $Zahl3 = Random(1, 3, 1)

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

    Sleep(10)
    If $Zahl1 <> $Zahl2 <> $Zahl3 Then
    MsgBox(0,"","Zahl 1 und 2 und 3 sind ungleich")
    MsgBox(0,"","" & $Zahl1 & ":" & $Zahl2 & ":" & $Zahl3 & ":")
    ExitLoop
    EndIf
    WEnd

    [/autoit]

    Als Ergebnis kann sogar 3 mal die 3 vorkommen,
    was mache ich falsch?

    viele Grüße

    Einmal editiert, zuletzt von Slider99 (29. Oktober 2012 um 15:12) aus folgendem Grund: auf gelöst gesetzt

  • Ah :D Das ist jetzt eine Interessante Situation ^^


    Okey, ich versuche es mal zu erklären:

    Vergleiche (z.B. 1=1) geben entweder True oder False zurück.
    Du hast nun folgendes:

    x <> y <> z (Hab nur für Darstellung die Variablen nach x, y und z geändert...)

    Als erstes wird geprüft, ob die Zahl x <> y ist. In diesen Fall gibt es ein True zurück. Demnach ist die 2te Abfrage:
    True <> z

    Und das ergibt logischerweise immer True :)


    Zudem hast du in deiem Vergleich
    $Zahl1 <> $Zahl2 <> $Zahl3

    kein = Zeichen eingebaut. Das bedeutet, dass dort automatisch folgendes angehangen wird:
    = True

    Das heißt, dein vergleich ist in wirklichkeit:
    If $Zahl1 <> $Zahl2 <> $Zahl3 = True Then


    >> Ich hoffe ich konnte dir das Klar machen ^^

  • Deine Logik ist nicht so ganz schlüssig... Wenn ich das jetzt richtig verstehe, wird zuerst Zahl1 mit Zahl2 verglichen und das Ergebnis dieser Operation dann mit Zahl3, was überhaupt keinen Sinn macht. Ich bin mir aber nicht 100%ig sicher, da ich mich mit der inneren Arbeitsweise von AutoIt nicht so gut auskenne.
    Das hier wäre zumindest ein funktionierender Vorschlag, aber vielleicht lässt sich das auch noch weiter optimieren.

    Spoiler anzeigen
    [autoit]

    While 1
    $Zahl1 = Random(1, 3, 1)
    $Zahl2 = Random(1, 3, 1)
    $Zahl3 = Random(1, 3, 1)

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

    Sleep(10)
    If Not ($Zahl1 = $Zahl2 Or $Zahl1 = $Zahl3 Or $Zahl2 = $Zahl3) Then
    MsgBox(0, "", "Zahl 1 und 2 und 3 sind ungleich")
    MsgBox(0, "", "" & $Zahl1 & ":" & $Zahl2 & ":" & $Zahl3)
    ExitLoop
    EndIf
    WEnd

    [/autoit]


    Edit: Zu spät ^^.

  • Probiere es mal damit:

    [autoit]


    While 1
    $Zahl1 = Random(1, 3, 1)
    $Zahl2 = Random(1, 3, 1)
    $Zahl3 = Random(1, 3, 1)

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

    Sleep(10)
    If $Zahl1 <> $Zahl2 And $Zahl1 <> $Zahl3 And $Zahl2 <> $Zahl3 Then
    MsgBox(0,"","Zahl 1 und 2 und 3 sind ungleich" & @CRLF & $Zahl1 & ":" & $Zahl2 & ":" & $Zahl3 & ":")
    ExitLoop
    EndIf
    WEnd

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Der <> Operator gibt als Ergebnis boolesche Werte zurück - also entweder TRUE oder FALSE.
    Verkettete und verschachtelte Ausdrücke werden in AutoIt von innen nach außen aufgelöst.

    Betrachten wir dies nun am Beispiel:
    Zahl1 = 1, Zahl2 = 1, Zahl3 = 3.

    Deine Anweisung If $Zahl1 <> $Zahl2 <> $Zahl3 Then macht nun folgendes:

    • Als erstes wird $Zahl1 <> $Zahl2 ausgewertet -> 1 <> 1 = FALSE
    • Übrig bleibt dann noch If FALSE <> $Zahl3 Then -> das führt implizit zu der Abfrage If 0 <> 3 Then -> also True

    Problem erkannt?
    Wenn ja dann findest du deine Lösung in der Nutzung der logischen Operatoren And, Or und Not.


    Edit: Tja - mit Netzwerkproblemen sollte man nicht posten - da muss man einfach der letzte werden ;)

    kein = Zeichen eingebaut. Das bedeutet, dass dort automatisch folgendes angehangen wird:
    = True

    Das heißt, dein vergleich ist in wirklichkeit:
    If $Zahl1 <> $Zahl2 <> $Zahl3 = True Then

    Nein - warum sollte man nochmal mit True vergleichen?
    Das wäre ein zusätzlicher Vergleich welcher am Wert nichts ändert.
    Wenn es so wäre wie du schreibst dann wäre die Ausgabe auch eine völlig andere.
    Der "="-Operator hat eine höhere Priorität als der "<>"-Operator und wird dadurch zuerst ausgeführt.
    Es würde also zuerst $Zahl3 = True geprüft und dieses Ergebnis dann mit dem Ergebnis von $Zahl1 <> $Zahl2 verglichen.

    Einmal editiert, zuletzt von AspirinJunkie (29. Oktober 2012 um 14:49)

  • Vergleiche (z.B. 1=1) geben entweder True oder False zurück.
    Du hast nun folgendes:

    Und das ergibt logischerweise immer True :)

    Vielen Dank,
    das hört sich logisch an

    Deine Logik ist nicht so ganz schlüssig

    Ich wollte die Logik ganz einfach machen, war mir aber nicht der Handlungsweise des <> bewußt. Sollte man Lotto spielen und aus 49 Zahlen, 6 brauchen, dann wollte ich es so machen... Zahl1 <> Zahll2 <> Zahl3 usw. nur wenn alle Zahlen ungleich sind, dann hätte man seine Zahlen, aber jetzt weiß ich, dass es so nicht geht

    sehr vielen Dank

    Der <> Operator gibt als Ergebnis boolesche Werte zurück - also entweder TRUE oder FALSE.
    Verkettete und verschachtelte Ausdrücke werden in AutoIt von innen nach außen aufgelöst.

    Betrachten wir dies nun am Beispiel:
    Zahl1 = 1, Zahl2 = 1, Zahl3 = 3.

    Deine Anweisung If $Zahl1 <> $Zahl2 <> $Zahl3 Then macht nun folgendes:

    • Als erstes wird $Zahl1 <> $Zahl2 ausgewertet -> 1 <> 1 = FALSE
    • Übrig bleibt dann noch If FALSE <> $Zahl3 Then -> das führt implizit zu der Abfrage If 0 <> 3 Then -> also True

    Problem erkannt?
    Wenn ja dann findest du deine Lösung in der Nutzung der logischen Operatoren And, Or und Not.

    auch hier, herzliches Dankeschön

  • AspirinJunke >> Ich habe nicht gesagt, er soll es mit True vergleichen, habe lediglich nochmals geschrieben, wie die Abfrage in Autoit gelesen wird. Zum Bildlichen vorstellen x)

    Wie du schon sagst: Das wäre ein zusätzlicher Vergleich welcher am Wert nichts ändert.

  • Hab das schon verstanden wie du das meinst.
    Aber auch in AutoIt intern wird kein = True drangehängt.
    Wir haben als Ergebnis schon einen Boolschen Wert.
    Warum soll der nochmal mit einem boolschen Wert verglichen werden - vor allem wenn so dass damit der eigentliche Wert bestehen bleibt.
    "If" erfordert einen Boolschen Wert - und der ist da - auch ohne "= True".

  • Um x Zahlen zu prüfen, ob mind. eine doppelt vorkommt, würde ich nicht If ... Then benutzen, so wie in dem Beispiel, sondern würde die Zahl in ein Array schreiben, das Array sortieren und einfach die Zahl z.B. aufsteigen prüfen.
    Z.B. so was hier:

    [autoit]


    #include <Array.au3>
    Global $aZahlen[6]

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

    Do
    For $i = 0 To 5
    $aZahlen[$i] = Random(1, 49, 1)
    Next
    Until Check($aZahlen)
    _ArrayDisplay($aZahlen)

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

    Func Check($aZahlen)
    _ArraySort($aZahlen)
    Local $i = 0
    Do
    If $aZahlen[$i] = $aZahlen[$i + 1] Then Return 0
    $i += 1
    Until $i = UBound($aZahlen) - 1
    Return 1
    EndFunc

    [/autoit]


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Um x Zahlen zu prüfen, ob mind. eine doppelt vorkommt, würde ich nicht If ... Then benutzen, so wie in dem Beispiel, sondern würde die Zahl in ein Array schreiben, das Array sortieren und einfach die Zahl z.B. aufsteigen prüfen.
    Z.B. so was hier:

    vielen Dank,
    sehr guter Vorschlag :)