Fehler bei in Datei schreiben

  • zuerstmal guten morgen ;)

    Ich hab hier ein Script das ein Freund von mir geschrieben hat, und ich da immer wieder nicht reproduzierbare und unerklärliche Fehler bekomm. Es gibt Tage da läuft das Ding einwandfrei wie als wenn es noch nie was anderes gemacht hat, und andere Tage da darf ich nicht mal mit dem Mauszeiger in die Nähe kommen.

    Das Script soll bestimmte Dinge aus dem IE lesen und in ne ini schreiben. Da ich nich weiss ob und in wie weit ich das Ding veröffentlichen darf/soll werd ich das versuchen auf ein Minimum zu beschränken.

    Ich benutz den IE7 und WInXP Pro
    Wenn ihr noch Angaben oder sonstwas braucht bitte sagen, ich kenn das Programm, die Community und alle benötigten Angaben (noch) nicht, bitt seht es mir nach. ;)

    Die Fehlermeldung:
    Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    [autoit]

    IniWrite($riadfile, $Galaxie, $lastnumber,$arraytemp[1] & "," & $arraytemp[2] & ","& $arraytemp[3] &","& $Heimatsystem[$lastnumber][0])
    IniWrite($riadfile, $Galaxie, $lastnumber,$arraytemp[1] & "," & $arraytemp[2] & ","& $arraytemp[3] &","& ^ ERROR
    >Exit code: 1 Time: 97.533

    [/autoit]


    Zeile 710-733

    [autoit]

    Func los($user, $planet,$lastnumber,$flug)
    Flottezeigen($lastnumber,$von,$user,$flug)
    Hacken_setzen($lastnumber)
    $lastnumber = Flotten_Status($flug,$lastnumber)
    SendenKlick($flug)


    $oIE = _IEAttach ( $GameURL, "URL" )
    _IELoadWait ($oIE)
    $oFrame = _IEFrameGetCollection ($oIE, 3)
    $oTable = _IETableGetCollection ($oFrame, 4)
    $Heimatsystem = _IETableWriteToArray ($oTable, True)

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

    ;flotten name in die ini schreiben mit zugehorikkeit
    ;_ArrayDisplay($Heimatsystem)
    $arraytemp = StringSplit(IniRead($riadfile, $Galaxie, $lastnumber, "exit"), ",")
    ;_ArrayDisplay($arraytemp)
    IniWrite($riadfile, $Galaxie, $lastnumber,$arraytemp[1] & "," & $arraytemp[2] & ","& $arraytemp[3] &","& $Heimatsystem[$lastnumber][0])

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

    Return $lastnumber

    EndFunc

    [/autoit]

    Schonmal im vorraus ein herzliches Dankeschön.

    mfg Jürgen :)

    Einmal editiert, zuletzt von buja75 (15. Mai 2008 um 10:12)

    • Offizieller Beitrag

    Hi,
    die Fehlermeldung sagt es schon sehr genau. Dein Array $Heimatsystem[$lastnumber][0] ist halt zu diesem Zeitpunkt entweder kein Array oder $lastnumber verweist auf einen Index außerhalb des Arrays.
    Füge davor eine Fehlerabfrage ein, z.B.:

    [autoit]

    If (Not IsArray($Heimatsystem)) Or ($lastnumber > (UBound($Heimatsystem) -1)) Then Exit

    [/autoit]
  • Dein Fehler liegt hier:

    [autoit]

    $Heimatsystem = _IETableWriteToArray ($oTable, True)

    [/autoit]


    Entweder existiert die Tabelle nicht, oder aber die Zeile existiert nicht und $lastnumber liegt ausserhalb des Arrays
    Wenn es immer die letzte Zeile des Array sein soll würde ich anstatt $lastnumber

    [autoit]

    Ubound($heimatsystem)-1

    [/autoit]


    benutzen ;)
    //Edit: grml warst du schon wieder schneller :P

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Vielen Dank erstmal an euch ;)

    BugFix , was muss ich beachten wenn ich deine Fehlerabfrage einfüge, bzw wie muss ich die genau einfügen?
    Muss die noch in die Func mit rein, davor, oder wie?

    FireFlyer, wenn ich das richtig seh soll es schon immer lastnumber sein, muss ich dann alle lastnumber erstezen wenn nich welches dann genau?

  • [autoit]

    $lastnumber = Ubound($heimatsystem)-1

    [/autoit]

    Allerdings ist in der Function: "los" $lastnumber als Pararmeter definiert... das solltest du dann rausmachen und mein beispiel von oben unter das _IE_table write to array machen ;). Aber halt wirklich nur wenn das die letzte Zeile der Tabelle sein muss ... keine ahnung davon weiss ich zu wenig über dein skript wenn du anstatt "-1" "-2" nimmst bekommst hast du die vorletzte zeile usw ;)

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • hab die Fehlerabfrage nun so drin, hoffe das ist richtig.

    [autoit]

    ;flotten name in die ini schreiben mit zugehorikkeit
    ;_ArrayDisplay($Heimatsystem)
    $arraytemp = StringSplit(IniRead($riadfile, $Galaxie, $lastnumber, "exit"), ",")
    ;_ArrayDisplay($arraytemp)
    If (Not IsArray($Heimatsystem)) Or ($lastnumber > (UBound($Heimatsystem) -1)) Then Exit
    IniWrite($riadfile, $Galaxie, $lastnumber,$arraytemp[1] & "," & $arraytemp[2] & ","& $arraytemp[3] &","& $Heimatsystem[$lastnumber][0])

    [/autoit]
    Zitat

    Aber halt wirklich nur wenn das die letzte Zeile der Tabelle sein muss ... keine ahnung davon weiss ich zu wenig über dein skript

    sag was du wissen musst, ich weiss es nicht. ;)

    • Offizieller Beitrag

    Dein Snippet läßt leider nicht erkennen, an welcher Position $lastnumber einen Wert zugewiesen bekommt bzw. auf welche Weise dies geschieht und welche Rolle die Variable spielt. Wenn mit $lastnumber der letzte Wert im Array $Heimatsystem gemeint ist, brauchst du diese Variable überhaupt nicht. Denn das ist immer UBound($Heimatsystem)-1. Mich wundert nur, dass du $lastnumber als Parameter zum Funktionsaufruf übergibst und dieser Parameter den Zugriff auf ein Array regelt, dass erst in dieser Funktion erstellt wird und dessen Größe vorab nicht bekannt ist. Kurz: Dieser Parameter ist Quatsch und produziert nur Fehler.
    Es sei denn, es sind noch irgendwelche anderen Zusammenhänge, die hier nicht ersichtlich sind.
    Auf jeden Fall mußt du in der Funktion prüfen, ob das Array erstellt wurde und entsprechend reagieren.

    [autoit]

    $oTable = _IETableGetCollection ($oFrame, 4)
    If Not IsObj($oTable) Then Return SetError(1,0,-1) ; Fehler gesetzt, Func gibt -1 zurück
    $Heimatsystem = _IETableWriteToArray ($oTable, True)
    If Not IsArray($Heimatsystem) Then Return SetError(2,0,-1) ; Fehler gesetzt, Func gibt -1 zurück

    [/autoit]
  • es gibt noch mehr da $lastnumber ein wert ist der eine bestimmt position in der tabele angibt


    lösung fragen ob es ein array ist und erst dann, ansonsten pasiert ja nix da es nicht würglich gebraucht wird dient nur zu auswertung zwecken


    if isarray($Heimatsystem) and isarray($arraytemp) Then IniWrite($riadfile, $Galaxie, $lastnumber,$arraytemp[1] & "," & $arraytemp[2] & ","& $arraytemp[3] &","& $Heimatsystem[$lastnumber][0])


    mfg auch ein neuer

    mfg Torsten :thumbup:

    2 Mal editiert, zuletzt von duke (14. Mai 2008 um 18:08)