Schon wieder ich... :D Problem mit einer Schleife

  • Hallo, hab folgendes Programm für die Schule ertellt (unten die Downloadversion)

    In Zeile 43 gibt's einen Fehler. Was hab ich falsch gemacht? Ich komm nicht drauf :huh:

    Spoiler anzeigen
    [autoit]

    #include <IE.au3>
    #include <Inet.au3>
    #include <Math.au3>
    #include <string.au3>
    #include <array.au3>
    #include <GUIConstants.au3>

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

    $Anzahl = IniRead("config.ini", "Allgemein", "Anzahl", "0")
    If $Anzahl = "0" Then
    #Region --- CodeWizard generated code Start ---
    ;MsgBox features: Title=Yes, Text=Yes, Buttons=OK, Icon=Critical
    MsgBox(16, "Fehler", "Keine Anzahl gefunden. Abbruch.")
    #EndRegion --- CodeWizard generated code Start ---
    Exit
    EndIf

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

    $Anzahl = $Anzahl - 1

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

    Global $Stein[$Anzahl], $Formel[$Anzahl], $Farbe[$Anzahl], $Strichfarbe[$Anzahl], $Glanz[$Anzahl], $Vorkommen[$Anzahl], $Bild[$Anzahl], $Haerte[$Anzahl], $Eigenschaften[$Anzahl]

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

    GUICreate("Infos sammeln", 276, 76, 193, 115)
    GUISetBkColor(0)
    Global $Progress = GUICtrlCreateProgress(8, 8, 262, 9)

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

    GUISetState()

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

    Start()
    Bilder()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func Start()
    For $i = 0 To $Anzahl Step 1
    $Stein[$i] = IniRead("config.ini", "Steine", $i + 1, "0")
    If $Stein[$i] = "0" Then
    #Region --- CodeWizard generated code Start ---
    ;MsgBox features: Title=Yes, Text=Yes, Buttons=OK, Icon=Critical
    MsgBox(16, "Fehler", "Stein in Ini = 0")
    #EndRegion --- CodeWizard generated code Start ---
    Exit
    EndIf
    $html = _INetGetSource("http://www.mineralienatlas.de/lexikon/index.php/MineralData?mineral=" & $Stein[$i])
    If @error = 1 Then $Stein[$i] = $Stein[$i] & " wurde nicht gefunden."

    $Array = _StringBetween($html, '<td class="mineraldatakey"><p class="tightenable top bottom">Chemische Formel<a name="ChemischeFormel" id="ChemischeFormel"></a></p>', '<tr class="mineraldata">')
    $String = _ArrayToString($Array, "")
    $Array = _StringBetween($String, '<td class="mineraldata"><p class="tightenable top bottom">', '</p>')
    $String = _ArrayToString($Array, "")
    $Formel[$i] = $String

    $Array = _StringBetween($html, '<td class="mineraldatakey"><p class="tightenable top bottom"><a href="Farbe" class="wiki">Farbe</a><a name="Farbe" id="Farbe"></a></p>', '<tr class="mineraldata">')
    $String = _ArrayToString($Array, "")
    $Array = _StringBetween($String, '<td class="mineraldata"><p class="tightenable top bottom">', '</p>')
    $String = _ArrayToString($Array, "")
    $Farbe[$i] = $String

    $Array = _StringBetween($html, '<td class="mineraldatakey"><p class="tightenable top bottom"><a href="Strichfarbe" class="wiki">Strichfarbe</a><a name="Strichfarbe" id="Strichfarbe"></a></p>', '<tr class="mineraldata">')
    $String = _ArrayToString($Array, "")
    $Array = _StringBetween($String, '<td class="mineraldata"><p class="tightenable top bottom">', '</p>')
    $String = _ArrayToString($Array, "")
    $Strichfarbe[$i] = $String

    $Array = _StringBetween($html, '<td class="mineraldatakey"><p class="tightenable top bottom"><a href="Glanz" class="wiki">Glanz</a><a name="Glanz" id="Glanz"></a></p>', '<tr class="mineraldata">')
    $String = _ArrayToString($Array, "")
    $Array = _StringBetween($String, '<td class="mineraldata"><p class="tightenable top bottom">', '</p>')
    $String = _ArrayToString($Array, "")
    $Glanz[$i] = $String

    $Array = _StringBetween($html, '<td class="mineraldatakey"><p class="tightenable top bottom"><a href="Vorkommen" class="wiki">Vorkommen</a><a name="Vorkommen" id="Vorkommen"></a></p>', '<tr class="mineraldata">')
    $String = _ArrayToString($Array, "")
    $Array = _StringBetween($String, '<td class="mineraldata"><p class="tightenable top bottom">', '</p>')
    $String = _ArrayToString($Array, "")
    $Vorkommen[$i] = $String

    $Array = _StringBetween($html, '<td width="20" style="vertical-align: top; text-align: right;"><p class="tightenable top bottom"><a href="/VIEW.php?param=', '" class="named-interwiki"><img src="/VIEW')
    $String = _ArrayToString($Array, "")
    $html2 = _INetGetSource("http://www.mineralienatlas.de/VIEW.php?param=" & $String)
    $Array = _StringBetween($html2, '<td style="text-align: left;" colspan="2"><a href="javascript:history.go(-1)" style="text-decoraton:none"><img border="0" src="/', '" alt="Analcim" title="Analcim"></a></td>')
    $String = _ArrayToString($Array, "")
    $Bild[$i] = "http://www.mineralienatlas.de/" & $String

    $Array = _StringBetween($html, '<td class="mineraldatakey"><p class="tightenable top bottom"><a href="Mohsh%E4rte" class="wiki">Mohshärte</a><a name="Mohshrte" id="Mohshrte"></a></p>', '</tr>')
    $String = _ArrayToString($Array, "")
    $Array = _StringBetween($String, '<td class="mineraldata"><p class="tightenable top bottom">', '</p>')
    $String = _ArrayToString($Array, "")
    $Haerte[$i] = $String

    $Array = _StringBetween($html, '<td class="mineraldatakey"><p class="tightenable top bottom">Chem. Eigenschaften u. Tests<a name="ChemEigenschaftenuTests" id="ChemEigenschaftenuTests"></a></p>', '</tr>')
    $String = _ArrayToString($Array, "")
    $Array = _StringBetween($String, '<td class="mineraldata"><p class="tightenable top bottom">', '</p>')
    $String = _ArrayToString($Array, "")
    $Eigenschaften[$i] = $String

    $Rechnung = $Anzahl + 1
    $Rechnung = 100 / $Rechnung
    $Rechnung = $Rechnung * $i
    GUICtrlSetData($Progress, $Rechnung)

    If $i = $Anzahl Then ExitLoop
    Next
    EndFunc ;==>Start

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

    Func Bilder()
    Global $Downloads = UBound($Bild)

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

    Global $DownloadDir = @ScriptDir & "/Mineralienbilder/"

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

    ;Gui
    GUICreate("Test", 276, 76, 193, 115)
    GUISetBkColor(0)

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

    Global $Progress1 = GUICtrlCreateProgress(8, 8, 262, 9)
    Global $Progress2 = GUICtrlCreateProgress(8, 24, 262, 9)
    Global $StatLab = GUICtrlCreateLabel("", 8, 59, 262, 15)
    GUICtrlSetColor(-1, 0xffffff)
    Global $Button = GUICtrlCreateButton("Start", 8, 37, 262, 20, 0)

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

    GUISetState()

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

    ;Mainwhile
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button
    If Not _Download() Then
    ;Wenn es bei _Download ein error gab (Abbrechen wurde gedrückt)
    GUICtrlSetData($Progress1, 0)
    GUICtrlSetData($Progress2, 0)
    GUICtrlSetState($Button, $GUI_DISABLE)
    GUICtrlSetData($Button, "Abgebrochen")
    Sleep(1500)
    GUICtrlSetData($Button, "Neustart")
    GUICtrlSetState($Button, $GUI_ENABLE)
    Else
    ;Wenn es kein error gab
    GUICtrlSetData($Button, "Erfolgreich")
    GUICtrlSetData($StatLab, "Komplett")
    EndIf
    EndSwitch
    WEnd

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

    ;Funktionen

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

    $Text = ""

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

    For $i = 0 To $Anzahl
    ;Machen der fertigen Seite
    $Text = $Text & '<table border = "1"><tr><td>Name:</td><td>' & $Stein[$i] & '</td><td>Nummer:</td><td>' & $i & '/' & $i + 1 & '-' & $Anzahl + 1 & '</td></tr><tr><td colspan = "4"><img src =' & $DownloadDir & "\" & $Stein[$i] & ' border="0"></tr><tr>'
    $Text = $Text & '<td>Formel:</td><td>' & $Formel[$i] & '</td><td>Farbe:</td><td>' & $Farbe[$i] & '</td></tr><tr><td>Strichfarbe:</td><td>' & $Strichfarbe[$i] & '</td><td>Glanz:</td><td>' & $Glanz[$i] & '</td></tr><tr><td>Vorkommen</td><td colspan="3">' & $Vorkommen[$i] & '</td></tr>'
    $Text = $Text & '<tr><td>Eigenschaften:</td><td colspan="3">' & $Eigenschaften[$i] & '</td></tr><tr><td>H&auml;rte:</td><td>' & $Haerte[$i] & '</td><td>&nbsp</td><td>&nbsp</td></tr><tr><td colspan="4">&nbssp;</td></tr>'
    Next

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

    $oIE = _IECreate()
    _IEBodyWriteHTML($oIE, $Text)

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

    EndFunc ;==>Bilder

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

    Func _Download()
    Local $i, $iSize, $iBuf, $msg, $iProz, $iOldProz, $sFileName
    GUICtrlSetData($Button, "Abbrechen (0%)"); Setze button
    For $i = 0 To $Downloads - 1
    $iSize = InetGetSize($Bild[$i]);Holt sich die größe des downloads
    $sFileName = StringTrimLeft($Bild[$i], StringInStr($Bild[$i], "/", 1, -1));Der Dateiname des downlaods
    InetGet($Bild[$i], $DownloadDir & "\" & $Stein[$i], 0, 1);Datei wird gedownloadet
    GUICtrlSetData($StatLab, "Download: " & $sFileName & " (0%)");Setze statuslabel
    While @InetGetActive; Solange der Download aktiv ist
    $msg = GUIGetMsg(); Falls Abbrechen gedrückt wird
    If $msg = $Button Then Return InetGet("abort") - 1 ; Return ((Returnwert von Inetget = 1) - 1) = 0
    $iProz = Round(100 * @InetGetBytesRead / $iSize);Gibt die Prozentzahl (gerundet) zurück
    If $iProz <> $iOldProz Then;Wenn neue Prozentangaben <> alte Prozentangaben dann.. (Verhinder mögliches Flickern von Label/Button)
    $iOldProz = $iProz;Setze alte Prozentangabe = neue Prozentangabe
    GUICtrlSetData($Progress1, $iProz);Setze Progress 1 mit Prozentangabe des momentanen downlaods
    GUICtrlSetData($Progress2, $iBuf + ($iProz / $Downloads));Setze Progress 2 auf die Insgesamte Prozentanzahl
    GUICtrlSetData($Button, "Abbrechen (" & Round($iBuf + ($iProz / $Downloads)) & "%)");Setze Abbrechenbutton
    GUICtrlSetData($StatLab, "Download: " & $sFileName & " (" & $iProz & "%)");Setze Statuslabel mit Dateiname des downlaods und prozentangabe des downlaods
    EndIf

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

    Sleep(50) ;Damit Prozessorlast < 100% ;)
    WEnd
    $iBuf += (100 / $Downloads)
    Next
    Return 1
    EndFunc ;==>_Download

    [/autoit]

    Die config.ini als Test:

    Spoiler anzeigen


    [Allgemein]
    Anzahl=5

    [Steine]
    1=Gold
    2=Silber
    3=Dolomit
    4=Aluminium
    5=Kohle

    Einmal editiert, zuletzt von MatthiasG. (18. November 2008 um 16:06)

  • Aber ich hab doch schon oben definiert:

    [autoit]

    $Anzahl = $Anzahl - 1

    [/autoit]

    Darf man das so nicht?

    • Offizieller Beitrag

    Du deklarierst hier:

    [autoit]

    $Anzahl = $Anzahl - 1

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

    Global $Stein[$Anzahl], $Formel[$Anzahl], ;...usw.

    [/autoit]

    Somit haben die Array $Anzahl Elemente. Nimm als Bsp. 5: Bei der Adressierung startest du mit [0], das letzte Element ist also [4] ($Anzahl -1).

  • Ach entschuldigung, jetzt hab ich auch verstanden, was ich das andere Mal falsch gemacht habe... :)

    Das Array fängt ja mit 0 an und die Anzahl bezieht sich auf das gesamte inklusive 0. Jetzt versteh ich es auch :)

    Danke!