stehe auf dem schlauch bei operatoren + if-abfrage

  • ich stehe auf dem schlauch mit folgendem:

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

    Local $tr_found_1 = "", $tr_found_2 = "", $tr_found_3 = ""

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

    .....codekrams....

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

    if $debuglog = 1 then FileWrite($ToolTitle&"debug.log","mainloop - $tr_found_1:"&$tr_found_1&@LF)
    if $debuglog = 1 then FileWrite($ToolTitle&"debug.log","mainloop - $tr_found_2:"&$tr_found_2&@LF)
    if $debuglog = 1 then FileWrite($ToolTitle&"debug.log","mainloop - $tr_found_3:"&$tr_found_3&@LF)

    if $tr_found_1 <> "" And $tr_found_2 <> "" And $tr_found_3 <> "" Then
    _create_questbox_gui(3, "1", "2", "3")
    $tr_found_1 = ""
    $tr_found_2 = ""
    $tr_found_3 = ""
    EndIf

    [/autoit]

    das debuglog bestätigt die belegung der variablen wie folgt:

    Code
    mainloop - $tr_found_1:0
    mainloop - $tr_found_2:1
    mainloop - $tr_found_3:3


    das problem: trotzdem ist die if-abfrage nicht true, also wird nicht ausgeführt. - warum ?
    ist die 0 das problem ?

    Einmal editiert, zuletzt von WhiteLion (10. Juni 2011 um 16:35)

  • Also .... wenn die Variable $tr_found_1 ein Zahlenwert (int, in dem Fall 0) ist, dann ist

    [autoit]

    $tr_found_1 <> "" = false

    [/autoit]

    .

    Somit ist klar das die Bedingung nicht erfüllt wird.

    Wäre der Wert der Varibale $tr_found_1 ein String ( "0" ) dann wäre es true.

  • ist die 0 das problem ?

    Wenn $tr_found_1 = 0 dann vergleichst du in der If-Abfrage eine Zahl (0) mit einem String ("").
    Um diese 2 verschiedenen Datentypen zu vergleichen muss erst eine von beiden in den jeweiligen Datentyp gewandelt werden.
    Wenn man nun den Nullstring "" in eine Integer-Zahl wandelt kommt 0 heraus.
    Daher liefert If $tr_found_1 <> "" dann False.

  • aha, verstehe, irgendwie dachte ich immer autoit castet automatisch... wie auch immer.... jetzt stelle ich mir natürlich die frage wie bekomme ich meinen "0 int" gewandelt in einen stringtype damit mein verlgleich funktioniert?

    so?:

    [autoit]

    $tr_found_1 = String($IndexFound_AppsDirFilesIni)

    [/autoit]

    in $IndexFound_AppsDirFilesIni ist der int, also die "0"

  • irgendwie dachte ich immer autoit castet automatisch

    Macht es doch auch?
    Genau deswegen hast du ja erst das Problem.

    Wenn du also schon munter Datentypen durcheinanderwürfelst musst du dich als Urheber solcher zweifelhaften Konstrukte auch selbst explizit darum kümmern das diese korrekt verwendet werden.
    In dem Beispiel könnte man z.B. einen expliziten Stringvergleich durchführen:

    [autoit]

    If Not($tr_found_1 == "") Then MsgBox(0,"", "Test")

    [/autoit]


    Dann ist dieser Vergleich aber Case-Sensitive.
    Würde das Probleme schaffen könnte man stattdessen einen der beiden Operanden explizit in den jeweiligen anderen Datentyp umwandeln:

    [autoit]

    If String($tr_found_1) <> "" Then MsgBox(0,"", "Test")

    [/autoit]


    Nur halt aufpassen das du nicht wieder den Nullstring in eine Zahl wandelst - denn dann würde ja wieder 0 als Zahl rauskommen.

  • hmm, stimmt das casting in einen string konnte ich nicht tun, da ich den wert als int noch weiterverarbeite. deshalb frage ich jetzt mit stringlen ab ob sich was drin befindet.

    danke ;)

  • das casting in einen string konnte ich nicht tun, da ich den wert als int noch weiterverarbeite

    Am Datentyp der Variable ändert sich durch beide Beispiele nix.
    Was vorher ein Integer-Wert war bleibt ein Integer-Wert. Was vorher ein Float war bleibt ein Float...
    Nur für die Abfrage wird der Wert temporär gecastet - mehr nicht.
    In welcher Form du das weiterverarbeiten möchtest ist in dem Moment also eigentlich egal.