Fehlende/falsche Abbruchbedingung

  • Hallo Forum,

    ich hoffe auf Eure Hilfe.

    Ich versuche folgende zwei Probleme zu lösen und komme eifnach nicht weiter:

    1. In Zeile 47 funktioniert die zweite Bedingung ($line <> "#") einfach nicht. Mache ich eine MsgBox in Zeile 42 steht die # korrekt drin. Tue ich das gleiche aber innerhalb der While-Schleife ist meine MsgBox leer. Mache ich da irgendwas falsch? Ohne die zweite Bedingung läuft das Script durch. Mit der Bedingugn erhalte ich die Fehlermeldung

    [autoit]


    #include <Array.au3>
    #include <GuiListView.au3>
    #Include <GuiListBox.au3>

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

    ;Deklarieren von Arrays
    Dim $array[9]
    dim $pause = 1000

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

    ;Tastatur und Maus deaktivieren, um Fehler durch den Benutzer auszuschließen
    ;BlockInput(1)

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

    ;Öffent die Konfiguration, lesend!
    $cfg = FileOpen("globalA.cfg",0)

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

    ;Prüfen ob Datei zum Lesen geöffnet wurde
    If $cfg = -1 Then
    Exit(1)
    EndIf

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

    ;Aktiviert das entstprechende Fenster
    WinActivate("aktive Datenbank: Database FOR DEMO ONLY")
    sleep($pause)

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

    ;Öffnen des Dialogs "Subnetze"
    Send ("{ALT}")
    sleep($pause)
    Send ("v")
    sleep($pause)
    Send ("z")
    sleep($pause)

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

    ;Drücken des Buttons "Neu"
    Send ("{TAB 3}")
    sleep($pause)

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

    ;Einlesen der Datensätze aus "globalA.cfg"
    $zeile = FileReadLine($cfg)
    $line = Stringleft($zeile,1)

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

    ;Solange $Zeile ungleich -1
    While $zeile <> -1

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

    If $line <> "" or $line <> "#" Then

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

    $array = StringSplit($zeile, ";", 2)

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

    sleep($pause)
    Send("{Enter}")

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

    ;Array füllen
    $id = $array[0]
    $location = $array[1]
    $ip = $array[2]
    $subnet = $array[3]
    $gw = $array[4]
    $ip2 = $array[5]
    $subnet2 = $array[6]
    $netmask = $array[7]

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

    ;Eintragen der Werte
    Sleep($pause)
    Send($id & "-MKNBw")
    Sleep($pause)
    Send ("{TAB}")
    Sleep($pause)
    Send("^a")
    sleep($pause)
    Send("{DEL}")
    Send ($location)
    Sleep($pause)
    Send ("{TAB 2}")
    Sleep($pause)
    Send($netmask)
    Sleep($pause)
    Send ("{TAB}")
    Sleep($pause)
    Send($subnet2)
    Sleep($pause)
    send("{TAB}")

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

    ;Handler für Fenster
    $handle = ControlGetHandle("aktive Datenbank: Database FOR DEMO ONLY","","[CLASS:ListView20WndClass; INSTANCE:2]")
    ;Item in Text finden
    $Item = _GUICtrlListView_FindInText($handle, $id)
    If $Item >= 0 Then
    ;Item selektieren
    _GUICtrlListView_SetItemFocused($handle,$Item)
    ;Item blau unterlegen
    _GUICtrlListView_SetItemSelected($handle,$Item)
    Send ("{TAB}")
    Send("{ENTER}")
    Send ("{TAB 3}")
    sleep(200)
    Send("{ENTER}")
    Else
    MsgBox(1,"debug", "Element "&$id&" nicht vorhanden")
    EndIf

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

    EndIf

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

    ;Erneutes Einlesen der nächsten Zeile
    $zeile = FileReadLine($cfg)
    $line = Stringleft($zeile,1)

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

    WEnd

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

    Send ("{TAB 5}")
    Send("{ENTER}")

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

    ;Config-File schließen
    $cfg = FileClose("globalA.cfg")

    [/autoit]


    Ich versuche folgende zwei Probleme zu lösen und komme eifnach nicht weiter:

    1. In Zeile 47 funktioniert die zweite Bedingung ($line <> "#") einfach nicht. Mache ich eine MsgBox in Zeile 42 steht die # korrekt drin. Tue ich das gleiche aber innerhalb der While-Schleife ist meine MsgBox leer. Mache ich da irgendwas falsch? Ohne die zweite Bedingung läuft das Script durch. Mit der Bedingugn erhalte ich die Fehlermeldung:

    Zitat

    ...PfadzurDatei\bla.au3 (56) :==> Array variable has incorrect number of subscripts or subscript dimension range exceeded:
    $location = $array[1]
    $location = ^ ERROR

    Der Fehler ist für mich auch klar, er läuft in den If-Zweig rein und hat dann nichts zu füllen, da nur ein Zeichen im Array drin steht. Die Frage ist nur, warum läuft er da überhaupt rein?

    2. Mein zweites Problem ist die Abbruchbedingung der Whileschleife mit meinem Konstrukt komme ich irgendwie nie auf die -1, die meine Schleife beenden würde, kann mir da jemand weiterhelfen oder zumindest nen Tip geben. Ich hab echt keien Ahnung mehr was ich noch probieren soll ;(

    Ich bedanke mich für Eure Mühe im Voraus.


    Mfg
    xeon2k

    Einmal editiert, zuletzt von xeon2k (26. April 2011 um 15:21)

  • Dein Problem hier ist die Logik. Dein If trifft immer zu, egal was in $line steht.
    Deine If bedingung:
    Wenn $line nicht leer ist oder wenn es nicht "#" ist. Es gibt 3 Möglichkeiten:
    1. Wenn $line nun "" ist trifft $line <> "#" zu also führt den Code aus.
    2. Wenn $line nun "#" ist trifft $line <> "" zu also führt er den Code aus.
    3. Wenn $line irgendetwas anderes ist treffen beide zu und er führt den Code aus.
    Ich denke mal du brauchst And anstatt des Or.
    Dann wird der Code nur ausgeführt wenn $line weder "" noch "#" ist

  • Zu deiner While Schleife

    Setz mal

    [autoit]

    While 1

    [/autoit]

    oben hin
    und in Zeile 106

    [autoit]

    ;Erneutes Einlesen der nächsten Zeile
    $zeile = FileReadLine($cfg)
    If @error = - 1 Then Exitloop
    $line = Stringleft($zeile,1)

    [/autoit]

    $Zeile wird nie - 1 es sei denn, in der Zeile steht - 1. Es wird nur ein Error gesetzt, der - 1 ist, wenn das Dateieende erreicht ist

  • Vielen Dank für die Antworten. Mit Eurer Hilfe konnte ich mein Problem lösen. :)

    Schnitzel:

    Ich dachte eigentlcih immer, dass bei AND beide Bedingungen zutreffen müssen und bei OR nur eine. Bin ich wohl falsch informiert ?(

    Trotzdem vielen Dank.


    Mfg
    xeon2k

  • Nochmal vielleicht etwas verständlicher

    [autoit]

    If $line <> "" or $line <> "#" Then

    [/autoit]


    Wenn Deine Variable nicht leer ist, führst du die folgenden Befehele aus
    Wenn in deiner Varibale die Raute ("#") steht, ist die Variable auch nicht leer, also wird der Code ausgeführt
    Wenn deine Variable leer ist, ist sie nicht gleich der Raute ("#"), also wird der Code auch weiter ausgeführt

  • Habe meinen "Denkfehler" gefunden. Ich ging vorher von einem "=" bei meiner If-Anweisung aus.

    Vielen Dank für die Unterstützung. Ich denke das Thema kann geschlossen werden.


    Mfg
    xeon2k