Array Problem

  • Hallo,

    ich erhalte diese Fehlermeldung in SCite:

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

    Da mein Script mittlerweile sehr umfangreich ist und mehrere
    Teile included wurden beschränke ich mich aufs wesentliche.

    1. Das Problem ist Arrays sollen per Loop in eine Listview!
    Einzeln funktioniert das! Aber ich krieg die Spalten nicht in einem Rutsch befüllt.
    Jedes Array beinhaltet mehrere Inhalte.

    Spoiler anzeigen
    [autoit]


    for $f = 0 to UBound($aGattung) -1

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

    $d = $aGattung[$f]&"|"&$aWelpe[$f]&"|"&$aPapiere[$f]

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

    GUICtrlCreateListViewItem($d, $hListView)
    next

    [/autoit]

    Fülle ich meine Listview mit einem Eintrag, dann klappt das!
    also

    Spoiler anzeigen


    $d = $aGattung[$f]
    oder
    $d = $$aWelpe[$f]

    wenn mehrere Spalten gefüllt werden, dann erhalte ich
    immer die Meldung
    Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    Im Internet habe ich diese Lösung gefunden

    Spoiler anzeigen
    [autoit]


    Array variable has incorrect number of subscripts or subscripts dimension range exceeded
    Fehler: Der Arrayvariablenaufruf hat den Index oder die Dimension überschritten

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

    Beispiel:

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

    Global $array[1][5]

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

    MsgBox(0,"",$array[10][10])

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

    Errormeldung:

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

    C:\**\**\**.au3 (1) : ==> Array variable subscript badly formatted.:
    Global $array[0][5]
    Global $array[^ ERROR

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

    Lösung:

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

    Erweitern sie den Array oder ändern sie den Aufruf.

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

    Global $array[11][11]

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

    MsgBox(0,"",$array[10][10])

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

    oder

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

    Global $array[1][5]

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

    MsgBox(0,"",$array[0][1])

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

    Da brächte ich Hilfe, die Anzahl ist jedesmal unterschiedlich.
    Ich kann also die Arrays nicht fest bestimmen
    Die Variablen habe ich als Global deklariert!


    Liebe Grüße
    Ilse ;)

  • misterspeed,

    guten Morgen,
    konnte mich heute erst wieder melden.

    hm..wenn ich mir die Arrays nacheinander mit Arraydisplay ansehe,
    dann ist die Anzahl unterschiedlich. Aber mindestens 25
    Das konnte ich dann im Loop lösen.
    Aber hier erhalte ich noch die Fehlermeldung:
    Es sind 2 Loops verschachtelt:

    Spoiler anzeigen
    [autoit]


    $var = IniReadSection(@ScriptDir & '\Meine.ini', "Liste")
    For $i = 1 to UBound($var) -1
    $aWelpe= StringRegExp($sSource,'\shref="(http://cgi.*?)">',3)
    $aGattung = StringRegExp($sSource,'\Gattung="(*?)">',3)
    $aPapiere = StringRegExp($sSource,'\Papiere="(*?)">',3)

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

    for $f = 0 to 25 -1
    $d = $aGattung[$f]&"|"&$aWelpe[$f]&"|"&$aPapiere[$f]
    GUICtrlCreateListViewItem($d, $hListView)
    next

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

    next

    [/autoit]

    Kurze Erklärung zum Loop:
    Die Links erhalte ich mit IniReadSection
    So sieht die Ini aus:

    Spoiler anzeigen
    [autoit]


    [Liste]
    1=http://www.Hunde.de
    2=http://www.Katzen.de

    [/autoit]

    Folgenden Fehler müsste ich abfangen:
    Der Ablauf der IniReadSection:

    1. Hunde.de wird geöffnet
    2. RegEx Muster werden erkannt
    3. Listview wird geschrieben

    Dann Link ohne RegEx Erfolg = FEHLER

    1. Katzen.de wird geöffnet
    2. REGEX Muster (bzw. Array ist leer)
    3. Listview wird nicht geschrieben (Absturz)


    Wie kann man, wenn ein RegEx leer ist, den Loop-Vorgang
    ohne Eintrag in die Listview fortsetzen?
    (Falls es daran liegen sollte...)


    Liebe Grüße
    Ilse ;)

  • Du gehst das sehr seltsam an. Und deine Lösung mit den 25 Einträgen funktioniert bestenfalls zufällig und sehr wahrscheinlich nicht für jede Seite. Wo wir schon bei der ersten Frage wären. Welchen Sinn macht die äussere Schleife? Du gehst zwar das Ergebnis von inireadsection in der Schleife durch, jedoch machst du reingarnix mit den Ergebnissen. Woher kommt die Variable sSource ? Du müsstest nach meinem Verständnis des Scriptes doch in der äusseren Schleife erstmal den Quellcode des aktuellen ini Eintrages mit inetread oder ähnlchem auslesen (also im ersten Durchgang hunde.de, im zweiten dann katzen.de usw.). Sobald du also dann den aktuellen Seitenquelltext hast kannst du diesen mit strinregexp durchsuchen. Gehen wir mal davon aus, dass du das nur hier unterschlagen hast und im echten Script alles korrekt enthalten ist.

    Jetzt hast du immernoch das Problem, dass du darauf hoffen musst, dass zu jeder der 3 Suchen gleichviele Ergebnisse zurückkommen. Wenn das nicht so ist kannst du garnix mehr damit anfangen weil du die 3 Dinge nicht korrekt zueinander zuordnen kannst. Bringt dir ja nix. Woher willst du danach noch wissen ob eintrag Welpe 5 auch zu Papiere 5 gehört? Hier musst du erstmal ansetzen und ggf. dein Suchsystem überdenken, das kann man aber ohne Details wie die Seiten ausschaun schlecht nachvollziehen.

    Wenn du mal sicherstellen kannst, dass alle drei Arrays gleich groß sind, dann funktioniert auch die innere Schleife so wie du es im Startpost bereits hattest.

    Poste doch einfachmal einen ungekürzten Seiten Quellcode damit wir das testen können, denke ja mal nicht, dass hunde.de wirklich die Suchseite ist, denn da hab ich gerade nix gesehen was nur annähernd nach dem ausschaut was du suchst.

  • Hallo Misterspeed,

    ich prüfe nochmals alles durch
    ist mittlerweile etwas komplex, deßhalb diese Scriptteile.
    Also, Sinn der äußeren Schleife....

    Spoiler anzeigen
    [autoit]


    $var = IniReadSection(@ScriptDir & '\Meine.ini', "Liste")
    For $i = 1 to UBound($var) -1
    $sSource= BinaryToString(inetread($var[$i][1]))
    $aWelpe= StringRegExp($sSource,'\shref="(http://cgi.*?)">',3)
    $aGattung = StringRegExp($sSource,'\Gattung="(*?)">',3)
    $aPapiere = StringRegExp($sSource,'\Papiere="(*?)">',3)

    [/autoit]

    Hier werden die Haupt-Links gelesen.
    Die innere Schleife soll dann die Liste füllen,
    Wenn RegEx z.B. bei Welpe einen Eintrag hat!!!!

    Welpe, Gattung, Papiere
    ist ein Datensatz. Die hängen zusammen!
    Existiert kein Welpe, existiert kein Datensatz! Somit liefert
    $sSource= BinaryToString(inetread($var[$i][1]))
    manchmal Einträge bei Seiten und manchmal nicht!
    Aber dann sollte der Loop weiterlaufen zum nächsten $sSource

    Im Prinzip funktioniert das, halt nur dann nicht,
    wenn $sSource= BinaryToString(inetread($var[$i][1])) z.B. kein Welpe findet.
    Beispiel:
    3=www.voegel.de
    4=www.welpen.de
    das bedeutet Loop = RegEx hat kein Welpe, weiter zu Welpen.de
    RegEx hat Welpen,
    Liste kann also gefüllt werden.

    huh...
    ich probiers nochmal durch.

    Viele Grüße
    Ilse ;)

  • Welpe, Gattung, Papiere ist ein Datensatz. Die hängen zusammen!
    Existiert kein Welpe, existiert kein Datensatz!

    Naja scheinbar ist dem ja nicht so, denn du hast vorhin geschrieben, dass die Arrays teilweise unterschiedlich groß sind, also zum Beispiel mehr Welpen als Papiere gefunden werden, was dann zum Absturz führt in der inneren Schleife weil du einen Papierindex ansprichst der nicht existiert. Deswegen ja meine Bitte um einen ungekürzten Webseiten Quellcode.

    Hier mal eine ordentliche Version, die dir auch Rückmeldungen gibt mit dennen du den Fehler nachvollziehen kannst. Du solltest dir grundsätzlich angewöhnen auf Fehler zu prüfen:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    $var = IniReadSection(@ScriptDir & '\Meine.ini', "Liste")
    If @error Then
    MsgBox(0, "Fehler", "Es wurden keine Schlüssel / Werte in der ini Datei gefunden!")
    Else
    For $i = 1 to UBound($var) -1
    $sSource= BinaryToString(inetread($var[$i][1]))
    if $sSource == "" Then
    MsgBox(0,"Fehler","Seitenquelltext von " & $var[$i][1] & " wurde nicht korrekt ausgelesen!")
    ContinueLoop
    EndIf

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

    $aWelpe= StringRegExp($sSource,'\shref="(http://cgi.*?)">',3)
    if @error then
    MsgBox(0,"Fehler","Stringregexp konnte keine Welpen auf " & $var[$i][1] & " finden!")
    ContinueLoop ; startet die äussere Schleife sofort mit nächstem Index neu, die innere Schleife wird also nicht ausgeführt wenn es zu Fehlern kommt!
    EndIf

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

    $aGattung = StringRegExp($sSource,'\Gattung="(*?)">',3)
    if @error then
    MsgBox(0,"Fehler","Stringregexp konnte keine Gattung auf " & $var[$i][1] & " finden!")
    ContinueLoop ; startet die äussere Schleife sofort mit nächstem Index neu, die innere Schleife wird also nicht ausgeführt wenn es zu Fehlern kommt!
    EndIf

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

    $aPapiere = StringRegExp($sSource,'\Papiere="(*?)">',3)
    if @error then
    MsgBox(0,"Fehler","Stringregexp konnte keine Papiere auf " & $var[$i][1] & " finden!")
    ContinueLoop ; startet die äussere Schleife sofort mit nächstem Index neu, die innere Schleife wird also nicht ausgeführt wenn es zu Fehlern kommt!
    EndIf

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

    if UBound($aWelpe) = UBound($aGattung) And UBound($aWelpe) = UBound($aPapiere) Then ; führt innere Schleife nur dann aus wenn alle Treffer Arrays gleich groß sind!
    for $f = 0 to UBound($aWelpe) -1
    $d = $aGattung[$f]&"|"&$aWelpe[$f]&"|"&$aPapiere[$f]
    GUICtrlCreateListViewItem($d, $hListView)
    next
    Else
    MsgBox(0,"Fehler","Die Suchergebnisse auf " & $var[$i][1] & " waren fehlerhaft bzw nicht gleich groß:" & @CRLF & @CRLF & _
    "Welpen: " & UBound($aWelpe) & @CRLF & _
    "Gattung: " & UBound($aGattung) & @CRLF & _
    "Papiere: " & UBound ($aPapiere) )
    EndIf
    Next
    EndIf

    [/autoit]

    2 Mal editiert, zuletzt von misterspeed (5. Juli 2011 um 14:59)

  • Hallo Misterspeed,

    ...mußte leider nochmal los.
    Ich werde deinen Rat befolgen auf Fehler zu prüfen.
    Muß wirklich sagen, daß das alles sehr schön aufgeräumt aussieht.

    Ich mach mich sofort dran meinen Code,
    (wie vom großen Meister gelernt :thumbup: ) zu verbessern.

    1 RegEx war nicht in Ordnung (die anderen prüf ich auch nochmal...)
    Ich glaube ich schaff das jetzt.

    Melde mich wieder

    Liebe Grüße Ilse ;)
    und Danke für dein Beispiel m. Kommentaren