arrayeintrag nicht vorhanden ----> absturz

  • ich lese eine seite aus und meist enthält $sImageSiteUrl[9] auch daten. selten jedoch nicht. wie kann ich es umgehen das mir das script abbricht wenn in $sImageSiteUrl[9] keine daten stehen?

    die fehlermeldung ist folgende:

    Code
    F:\Autoit\tool\tool.au3 (92) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $sImageUrl = StringReplace ( $sImageSiteUrl[9], @CRLF, "" )
    $sImageUrl = StringReplace ( ^ ERROR


    [autoit]

    $sImageSiteUrl = _StringBetween($sSource, $sImageSiteLeft,'"')
    If @error Then Return ;fehlermeldung abfangen und in funktion umleiten
    $sImageUrl = StringReplace ( $sImageSiteUrl[9], @CRLF, "" ) ; entfernt LF und CR
    If @error Then Return
    If $sImageUrl == 'http://i.media-imdb.com/images/SF510b625ec4fcf55477e5407bb3f5003e/consts/show_mini.png' Then Return

    [/autoit]


    ich danke schonmal für eure hilfe. :)

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    Einmal editiert, zuletzt von Maximus1 (16. Januar 2011 um 16:11)

  • du kannst mit

    [autoit]

    IsArray

    [/autoit]


    prüfen ob es geklappt hat

    PS: Sonderfall bei _stringBetween: Mit @error kannst du es auch prüfen

    • Offizieller Beitrag

    Laß dir mal mit _ArrayDisplay den inhalt von $sImageUrl anzeigen.
    Damit kannst du kontrollieren ob es das 10 Element überhaupt gibt.
    10.Element, weil die Nummerierung bei 0 beginnt. !!!

    [autoit]

    $sImageSiteUrl = _StringBetween($sSource, $sImageSiteLeft, '"')
    If @error Then Return ;fehlermeldung abfangen und in funktion umleiten
    If UBound($sImageUrl) - 1 >= 9 Then; Prüfen ob Feld Element 9 existiert
    $sImageUrl = StringReplace($sImageSiteUrl[9], @CRLF, "") ; entfernt LF und CR
    If @error Then Return
    If $sImageUrl == 'http://i.media-imdb.com/images/SF510b625ec4fcf55477e5407bb3f5003e/consts/show_mini.png' Then
    EndIf;

    [/autoit]
  • @TheShadowAE: mit isarray kann ich leider nicht viel anfangen. ich wüsste nicht wie ich es einsetzen soll. ein array wird erstellt und wenn [9] nicht vorhanden ist, geht es nur bis [5]; sonst bis [15]
    Raupi : es wird immer ein array angelegt


    wenn es nur bis [5] geht, steht an [2] http://i.media-imdb.com/images/SF510b6…s/show_mini.png
    wenn ich nun aber abfrage ob [2] http://i.media-imdb.com/images/SF510b6…s/show_mini.png steht, geht es durch und der rest des scriptes wird bei jedem weiteren durchlauf nicht mehr ausgeführt.
    wenn ich abfrage ob [9] http://i.media-imdb.com/images/SF510b6…s/show_mini.png existiert und es positiv ist wird returned ansonsten wird weitergemacht.

    also dachte ich mir, wenn ich zuerst [2] abfrage sollte es ja auch gehen..... pustekuchen.

    [autoit]

    $sImageUrl = StringReplace ( $sImageSiteUrl[2], @CRLF, "" ) ; entfernt LF und CR
    If @error Then Return
    If $sImageUrl == 'http://i.media-imdb.com/images/SF510b625ec4fcf55477e5407bb3f5003e/consts/show_mini.png' Then Return

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

    $sImageUrl = StringReplace ( $sImageSiteUrl[9], @CRLF, "" ) ; entfernt LF und CR
    If @error Then Return
    If $sImageUrl == 'http://i.media-imdb.com/images/SF510b625ec4fcf55477e5407bb3f5003e/consts/show_mini.png' Then Return

    [/autoit]

    das klappt irgendwie nicht, wie oben ja schon beschrieben.


    so wärend ich das hier geschrieben habe, habe ich das mit dem ubound ausprobiert und siehe da, kaum macht man es richtig, funktioniert es auch. :)

    ich habe folgendes eingebaut:

    [autoit]

    $rows=UBound ( $sImageSiteUrl)
    MsgBox(0,"",""&$rows)
    If $rows < 9 Then Return
    MsgBox(0,"","weiter nach rowabfrage")

    [/autoit]


    die msgboxen werden später wieder entfernt.

    ich danke euch wiedereinmal. :)

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    • Offizieller Beitrag

    Vergiß aber nicht das dir Ubound die Anzahl der Elemente zurückliefert, die Nummerierung aber bei 0 anfängt.

    Liefert Ubound = 9 dann hat das letzte Element die Nummer 8 !!!!! Deshalb immer Ubound -1.

    Ist bei Autoit absolut Idiotensicher, es gibt kein LBound wie bei anderne Sprachen.

  • danke für den tip, auch wenn es hier in diesem fall sehr große unterschiede gibt und nicht auf einen genauen wert ankommt werde ich es im hinterkopf behalten. :)

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.