Wurzel (Sqrt) Rückgabewertproblem

  • Hallo autoit - community!
    Ich habe mit der Sqrt - Funktion ein bischen herumprobiert und bin dabei auf ein Problem mit dem Rückgabewert "-1.#IND" gestoßen.
    Der Quellcode und das Problem erklären sich von selbst.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    $Ergebnis = ""

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

    While 1

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

    $Wurzeltest = InputBox("Wurzelrückgabewert Test", "Gib die Zahl ein, deren Wurzel Du erfahren möchtest!")

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

    If @error = 1 Then
    Exit
    EndIf

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

    If $Wurzeltest > 0 And Not "" Then

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

    $Ergebnis = Sqrt($Wurzeltest)

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

    MsgBox(0, "Ergebnis der Wurzel", "Die Wurzel aus "&$Wurzeltest&" ist "&$Ergebnis&".")

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

    ElseIf $Wurzeltest < 0 And Not "" Then

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

    $Ergebnis = Sqrt($Wurzeltest)

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

    MsgBox(0, "Ergebnis der Wurzel", "Die Wurzel aus "&$Wurzeltest&" ist "&$Ergebnis&".")

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

    If $Ergebnis = "-1.#IND" Then ; <-\
    MsgBox(0, "Ungültige Eingabe!", "-1.#IND") ; <-- warum schlägt dieser Block fehl (sprich: erscheint erst gar nicht)?
    EndIf ; <-/
    Else
    MsgBox(0, "Ungültige Eingabe!", "Du hast nichts eingegeben."&@CR&"Probiere es erneut.")
    EndIf

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

    WEnd

    [/autoit]

    Vielen Dank im Voraus!

  • Naja das ganze ist etwas confus aufgebaut und könnte anders strukturiert bestimmt besser funktionieren aber so gehts

    Spoiler anzeigen
    [autoit]

    $Ergebnis = ""

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

    While 1
    $Wurzeltest = InputBox("Wurzelrückgabewert Test", "Gib die Zahl ein, deren Wurzel Du erfahren möchtest!")
    If @error = 1 Then Exit

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

    If $Wurzeltest > 0 And Not "" Then
    $Ergebnis = Sqrt($Wurzeltest)
    MsgBox(0, "Ergebnis der Wurzel", "Die Wurzel aus "&$Wurzeltest&" ist "&$Ergebnis&".")
    ElseIf $Wurzeltest < 0 And Not "" Then
    $Ergebnis = Sqrt($Wurzeltest)
    MsgBox(0, "Ergebnis der Wurzel", "Die Wurzel aus "&$Wurzeltest&" ist "&$Ergebnis&".")
    If $Ergebnis == "-1.#IND" Then ; <-\ == Case sensitiv
    MsgBox(0, "Ungültige Eingabe!", "-1.#IND")
    EndIf ; <-/
    Else
    MsgBox(0, "Ungültige Eingabe!", "Du hast nichts eingegeben."&@CR&"Probiere es erneut.")
    EndIf
    WEnd

    [/autoit]

    EDIT: und was sollen die endlosvielen Leerzeilen im Code und allgemein etwas auf das Format schauen, auch wenns nur wenig Code istm ist es trotzdem total unleserlich.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • [autoit]

    ;scriptzeile
    ;If $Wurzeltest > 0 And Not "" Then
    msgbox(0,0,not "") ;was sagt uns das?

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

    msgbox(0,0,True and not "") ;etwas anderes hätte mich gewundert..

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

    msgbox(0,0,False and not "") ;etwas anderes hätte mich ebenfalls gewundert...

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

    ;sollte wohl heißen
    If $Wurzeltest > 0 And $Wurzeltest<>"" Then

    [/autoit]
  • Du musst überhapt nicht auf einen leeren String testen. Denn ein leerer String wird im ersten Vergleich ($wurzeltest > 0) schon aussortiert, da er in den Zahlenwert 0 umgewandelt wird.

  • Danke für Eure schnellen Antworten. Der von mir gekennzeichnete Block wird auch nicht ausgeführt wenn ich das Skript ändere (s. Quelltext).

    Spoiler anzeigen
    [autoit]


    $Ergebnis = ""
    While 1
    $Wurzeltest = InputBox("Wurzelrückgabewert Test", "Gib die Zahl ein, deren Wurzel Du erfahren möchtest!")
    If @error = 1 Then
    Exit
    EndIf
    If $Wurzeltest = "" Then
    MsgBox(0, "Ungültige Eingabe!", "Du hast nichts eingegeben.")
    ElseIf $Wurzeltest = "-1.#IND" Then ; <-- das hier
    MsgBox(0, "Ungültige Eingabe!", "-1.#IND") ; <-- und das
    Else
    $Ergebnis = Sqrt($Wurzeltest)
    MsgBox(0, "Ergebnis der Wurzel", "Die Wurzel aus "&$Wurzeltest&" ist "&$Ergebnis&".")
    EndIf
    WEnd

    [/autoit]

  • wer lesen kannist klar im Vorteil ^^

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Du hast die Antwort von Darter nicht gelesen...
    Du führst keine Abfrage sondern eine Zuweisung aus.
    Um diese Mehrdeutigkeit aufzulösen wird in diesem Fall "==" (man bemerke die 2 Gleichheitszeichen) verwendet.
    Mal davon abgesehen hast du das Skript jetzt völlig verbaut.
    Nur der Rückgabewert von Sqrt() kann den Wert -1.#IND annehmen - du testest aber den Eingangsparameter darauf?!?

  • Spoiler anzeigen
    [autoit]

    While 1
    $Wurzeltest = InputBox("Wurzelrückgabewert Test", "Gib die Zahl ein, deren Wurzel Du erfahren möchtest!")
    If @error = 1 Then
    Exit
    EndIf
    If $Wurzeltest < 0 Or Int($Wurzeltest) = 0 Then
    MsgBox(0, "Ungültige Eingabe!", "Du hast entweder nichts, oder eine fehlerhafte Zahl eingegeben.")
    Else
    $Ergebnis = Sqrt($Wurzeltest)
    MsgBox(0, "Ergebnis der Wurzel", "Die Wurzel aus " & $Wurzeltest & " ist " & $Ergebnis & ".")
    EndIf
    WEnd

    [/autoit]
  • Sorry wegen dem Doppelpost aber ich hab in dem Spoiler einen Fehler gemacht. ;(
    Hier die von mir gemeinte Version.

    Spoiler anzeigen
    [autoit]


    $Ergebnis = ""
    While 1
    $Wurzeltest = InputBox("Wurzelrückgabewert Test", "Gib die Zahl ein, deren Wurzel Du erfahren möchtest!")
    If @error = 1 Then
    Exit
    EndIf
    $Ergebnis = Sqrt($Wurzeltest)
    If $Ergebnis = "-1.#IND" Then
    MsgBox(0, "Ungültige Eingabe!", "-1.#IND");wird nicht ausgeführt
    Else
    MsgBox(0, "Ergebnis der Wurzel", "Die Wurzel aus "&$Wurzeltest&" ist "&$Ergebnis&".")
    EndIf
    WEnd

    [/autoit]

  • Ich verweise nochmals hierauf ^^

    EDIT: oder hierauf

    Du hast die Antwort von Darter nicht gelesen...
    Du führst keine Abfrage sondern eine Zuweisung aus.
    Um diese Mehrdeutigkeit aufzulösen wird in diesem Fall "==" (man bemerke die 2 Gleichheitszeichen) verwendet.
    Mal davon abgesehen hast du das Skript jetzt völlig verbaut.
    Nur der Rückgabewert von Sqrt() kann den Wert -1.#IND annehmen - du testest aber den Eingangsparameter darauf?!?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Du musst einen Stringvergleich erzwingen. Dieser Fehlerfall lässt sich sonst irgendwie nicht abfragen.

    [autoit]

    If $Ergebnis == "-1.#IND" Then MsgBox(0, '', "Fehler")
    ; oder
    If String($Ergebnis) = "-1.#IND" Then MsgBox(0, '', "Fehler")

    [/autoit]

    Du hast die Antwort von Darter nicht gelesen...
    Du führst keine Abfrage sondern eine Zuweisung aus.
    Um diese Mehrdeutigkeit aufzulösen wird in diesem Fall "==" (man bemerke die 2 Gleichheitszeichen) verwendet.


    Das stimmt nicht. In If-bedingungen steht = immer für eine Abfrage und nie für eine Zuweisung. Dieser spezielle Fehlerfall wird von AutoIt aber nicht automatisch in einen String umgewandlet, warum auch immer. Daher muss man den Stringvergleich erzewingen, was mit dem ==-Operator möglich ist.