Array crash dimension range exceeded

  • Nabend,

    ich steh seit paar Stunden aufm Schlauch und weiß nicht wo es hängt, zum Ablauf:

    1. Ich lese alle Services im "automatisch Startmode" welche "nicht Running" sind aus und speichere diese in $temp array
    2. Ich stelle eine $excluded array bereit mit Services die excluded werden sollen.

    Quasi möchte ich Alle Services die nicht Running sind mit denen aus $excluded Liste vergleichen und diese dann in $temp entfernen, damit ich nur Services habe, die im automatisch startmode stehen und nicht running sind und meine "blacklist" beachtet wurde.

    Leider hauts beim Arraydelete immer hin. Das Script crashed einfach.

    Wenn 4 Services nicht laufen, 3 in der Blacklist sind. Werden 3 abgezogen und er sagt mir "jap hier der Service läuft nicht , soll aber laufen".
    Nehme ich aber an, dass alle Services laufen, die Laufen sollen. crashed das Ding.

    Sprich 4 nicht running gefunden, 4 auf der blacklist. $temp = leer = crash.

    Spoiler anzeigen


    Vielen Dank

  • meinst du so?

    Auf isObj prüfst du ja bereits, das kannst du auch beim Array machen. Alternativ kannst du auch prüfen ob Ubound($temp) grösser als null ist,
    damit er auch das -1 machen kann. Ist vielleicht nicht das beste, was man machen kann, aber quick&dirty sollte erstmal klappen.

  • EDIT: Oder man geht einfach rückwärts durch das Array... Das vergess ich immer :D

    AutoIt
    For $s = UBound($temp) - 1 To 0 Step -1
    	For $x = UBound($excludes) -1 To 0 Step -1
    		If $temp[$s] = $excludes[$x] Then ;wenn array $temp in $excluded liste dann 
    			_ArrayDelete($temp, $s) ; lösche element ; hier crashed es wenn die excludes komplett in $temp enthalten sind. Also das array komplett geleert wird

    Das Problem findest du in dem _ArrayDelete. Was passiert, wenn alle gelöscht wurden und $temp keine Elemente mehr enthält? Die 2te Schleife kann da immernoch laufen.

    AutoIt
    For $s = UBound($temp) - 1 To 0 Step -1
    	For $x = UBound($excludes) -1 To 0 Step -1
    		If $temp[$s] = $excludes[$x] Then ;wenn array $temp in $excluded liste dann 
    			_ArrayDelete($temp, $s) ; lösche element ; hier crashed es wenn die excludes komplett in $temp enthalten sind. Also das array komplett geleert wird
    			$s-=1
    			ExitLoop
    		EndIf
    	Next
    Next

    Durch das $s-=1 sorgst du dafür, dass keine Spalte ausgelassen wird und durch das ExitLoop wird der aktuelle Schleifendurchlauf beendet-> du kommst nicht in den Fall, dass das $ste Element gelöscht wurde, keine weiteren dahinter sind und das ArrayDelete später auf eine nicht existente Zeile zugreift.
    _ArrayDelete in eine Schleife aufzurufen ist was performence angeht auch eine blöde Idee. Stattdessen einen sonst nicht vorhandenen Wert eintragen (z.b. -1) und später alle -1 löschen:

    Spielt aber bei der geringen Array-Größe keine Rolle, schätz ich. Aber das $s-1 wird nicht benötigt, da erst am Ende gelöscht wird.

    Bsp. deines Problems (-> entspricht $s):
    0: "Wert1" 0: "Wert1"
    1: "Wert2" 1: "Wert2"
    2: "Wert3" 2: "Wert3"
    ->3: "Wert4" ;Hier löschen ==>3: "Wert5" ;und du läuft das $excludes weiter durch, löscht wieder und wieder, bis dort kein Eintrag mehr ist.
    4: "Wert5" 4: "Wert6"
    5: "Wert6"
    Außerdem Überspringst du dadurch, dass du kein $s-1 machst, Werte. Die nächste For-Schleife von $temp sähe so aus:

    0: "Wert1"
    1: "Wert2"
    2: "Wert3"
    3: "Wert5"
    ->4: "Wert6"
    Auf "Wert5" wird nie die gesamte Schleife $excludes angewendet, da die for-Schleife nie dafür aufgerufen wird.

    Also immer Vorsicht mit _arraydelete. Ich benutze es NIE bei mehr als 1 Value die gelöscht werden soll, weil es 1.Imperformant ist und man 2. Auf den Index achten muss.

  • Ich würde dafür ein 1 basiertes Array nehmen:

  • Ich weiß nicht ob ich das richtig verstanden habe aber vielleicht geht das ja

  • Ich denke mal, der Fehler tritt auf, weil du in Zeile 11 angegeben hast, dass du in $excludes[0] einen Counter haben willst, den du übrigens an keiner Stelle nutzt.

    _FileReadToArray(@ScriptDir & "\dependencies\excluded_services.txt", $excludes, 1) ;array count first element

    Wenn du dann noch Zeile 29 mit Zeile 30 vertauscht, dann funktioniert es.

    Spoiler anzeigen

    Einmal editiert, zuletzt von Bitnugger (8. September 2016 um 17:38)