Kann mir jemand helfen Fehler besser abzufangen? - Array variable has incorrect number of...

  • Hey Leute,
    ich habe hier ein Proggy, dass zur Steuerung und zum Streaming von einem Receivertyp dient. Dabei habe ich ein Problem mit Abstürzen, die ich bisher nicht in den Griff bekommen habe.
    Bei mir tritt nie ein Problem auf und bei vielen anderen auch nicht. Bei manchen Leuten gibt es aber regelmäßig scheinbar unmotivierte Abstürze.

    Das hängt mit einer Funktion zusammen, die alle 10 Sekunden den EPG abruft und die Daten in ein Array schreibt.
    (Das ist relativ ineffizient, weil ich die Daten eigentlich nur zum Anzeigen der Senderübersicht brauche. Das will ich auch ändern, aber den Fehler würde ich dennoch gerne verstehen, damit ich es in Zukunft besser machen kann.)

    Anhand der Fehlermeldung aus der Konsole, die ich vom kompilierten Programm mit einer zweiten Programminstanz abfange (das gibts auch hier im Forum ich glaube von CheaterDieter), weiß ich die Zeile und den Fehler:
    ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    Die Daten, die ich in eine Textdatei lade sehen so aus, wobei die Liste teilweise natürlich viel länger ist. Das sind die EPG Informationen über die gerade laufenden Sendungen:


    5554043700012b66 1423024200 12600 303711504893903373 ZDF-Morgenmagazin
    5554043700016d70 1423036200 2700 303711506001848303 Disco
    5554043700016d6e 1423035600 2700 303711506001709186 Da kommt Kalle
    5554043700016d6b 1423035000 2700 303711506001500791 Land unter Kontrolle
    4294041b00012b5c 1423024200 12600 295830205545347489 ZDF-Morgenmagazin


    Spoiler anzeigen
    [autoit]


    local $EPGdaten[1500][5] ; Vor der Funktion. Fest auf 1500 EPG Events begrenzt. Das war bisher auch scheinbar nicht das Problem.

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

    Func Bsp()
    If Not FileExists($PfadT & "Gt") Then InetGet($URLstart & $IP & ":" & $Webserver_Port & "/control/epg?ext", $PfadT & "Gt", 1, 1)
    If FileExists($PfadT & "Gt") Then
    $CopyEPGraw = FileCopy($PfadT & "Gt", $PfadT & "G", 1); hiermit versuche ich sicherzugehen, dass die Datei wirklich vollständig geladen ist, nachdem es auch mit InetGetInfo zu Abstürzen kam.
    For $i = 0 To 25
    If Not ($CopyEPGraw = 1) Then
    Sleep(10)
    Else
    ExitLoop
    EndIf
    Next
    EndIf
    If FileExists($PfadT & "G") Then
    Local $b2, $btemp
    _FileReadToArray($PfadT & "G", $b2)
    If IsArray($b2) Then
    $m = UBound($b2)
    ;~ Global $EPGdaten[$m][5]; Das habe ich auskommentiert, weil die Neudeklaration lange dauerte. so habe ich das Array fest auf 1500 Einträge Einträge gesetzt.
    Local $Sendung[$m][2]

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

    For $l = 1 To $m - 1
    If Not StringIsSpace($b2[$l]) Then ; Einfach mal hilflos geprüft, das keine Leerzeilen in den Daten sind.
    StringReplace($b2[$l], " ", "_")
    If @extended >= 4 Then ; Hier wollte ich sichergehen, dass auch wirklich 4 Splits möglich sind.
    $aSplit = StringSplit($b2[$l], " ")
    $EPGdaten[$l][0] = $aSplit[1] ; SenderID ; HIER TRITT DER FEHLER AUF. !!!!!!!!!!
    $EPGdaten[$l][1] = $aSplit[2] ; Startzeit
    $EPGdaten[$l][2] = $aSplit[3] ; Dauer
    $EPGdaten[$l][3] = $aSplit[4] ; SendungsID
    $atemp = StringSplit($b2[$l], " ")
    For $j = 1 To $atemp[0]
    If $j <= 4 Then ContinueLoop
    $Sendung[$l][1] &= $atemp[$j] & " " ; Sendung
    $EPGdaten[$l][4] = StringTrimRight($Sendung[$l][1], 1)
    Next
    EndIf
    EndIf
    Next
    _ArrayDelete($EPGdaten, 0)
    EndFunc

    [/autoit]

    Für jeden Tipp bin ich dankbar.

    Grüße autoiter

    Grüße autoiter

  • Du kannst ja mal in Zeile 28 einfügen:

    if ubound($aSplit)>2 then ;normal sind ja mehr als 2 Element darin (du greifst ja auf index 4 zu)

    msgbox(48,"",$b2[$l])

    endif

    Dann weiß;t du, was schief geht, denn der String wird ja (?falsch?) gesplittet. Dann kannst du ja nachvollziehen, was passieren sollte, bzw. was passiert (also wie der string aussieht, was passiert, wenn du ihn am " " teilst, etc.)

    (Vermutung: eine leerezeile am ende... du prüfst, ob non-whitespace zeichen in deinem string sind... eine leerzeile ist leer. Also auch OHNE non-whitespace zeichen (am @cr / @lf /@crlf wird ja gesplittet). Du müsstest also neben StringIsSpace($b2[$l]) sicherstellen, dass $b2[$l]<>"",also: if NOT StringIsSpace($b2[$l]) and NOT $b2[$l]<>"" then

    PS: sry, dass ich grad keine autoit tags nute... ich hab grad iwie son komisches men&uuml;, in dem die nicht vorhanden sind...

  • Liegt wohl daran, weil da ein paar "EndIf" fehlen ... in Zeile 41 für Zeile 15, in Zeile 42 für Zeile 18.

    Zeile 18... es reicht doch zu prüfen ob bei _FileReadToArray() ein Fehler aufgetreten ist, und falls ja, diesen dann ausgeben.
    If _FileReadToArray(...) Then
    mach was damit...
    Else
    Fehler ausgeben...
    EndIf

    Zeile 16. $btemp... kommt im Quelltext nicht mehr an andere Stelle vor...

    Doch guck mal hier...

    Spoiler anzeigen
  • Danke Bitnugger,

    Das mit den Endif tut mir leid. Ich habe einfach einen Ausschnitte aus der Funktion genommen. In Wirklichkeit werden die Bedingungen auch abgeschlossen.
    Ich habe das Skript jemanden testen lassen, bei dem die Abstürze auftraten. Scheinbar war es in diesem Fall tatsächlich mein falsches Verständnis von "StringIsSpace" als eindeutige Identifikation einer Leerzeile.

    Aber die Prüfung auf Array war auch Mist. Ich hatte das (auch an der Stelle) schon drin, aber es hat sich dann auf "If Not @error then" und IsArray beschränkt. Ich finde das Beispiel super und werde mal ein richtiges Errorhandling für das Array übernehmen.

    Grüße autoiter

    Einmal editiert, zuletzt von autoiter (5. Februar 2015 um 19:06)