Fehler bei 2d array.

  • Aloha liebe commies :)
    ich hab da ma wieder ein kleines Problem was ich nicht gelöst bekomme :( :S

    Bei diesem Stück programm

    Spoiler anzeigen
    [autoit]

    Func test ($avArray, $FullFilePath)

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

    if FileExists ($Stoptext) then

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

    $Stopfile = fileopen ($Stoptext,0)
    $avArray[$used][1] = $Stopfile

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

    endif

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

    EndFunc

    [/autoit]

    kommt diese Meldung

    Spoiler anzeigen

    "E:\Ordnerdurchsuchungsprogramm\test.au3 (92) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $avArray[$used][1] = $Stopfile
    ^ ERROR"

    Da ich einfach keinen Fehler entdecken kann woran es liegen kann, denke ich mal, ich übersehe ihn ^^

    Alle Variablen die in dem Stück programmcode vorhanden sind, sind deklariert.

    Der Sinn des stück codes soll sein, dass es im aktuellen verzeichnis überprüfen soll ob eine bestimmte -in diesem fall - textdatei vorhanden ist und den inhalt dieser in die 2te dimension des arrays schreiben.

    Hoffe ihr könnt mir helfen, wenn ihr mehr informationen braucht, sagt bitte bescheid, editiere dann flott.

    Vielen Dank und Grüße

    Maurawani

    EDIT:
    Hier mal der ganze Code

    Spoiler anzeigen
    [autoit]

    ;Mit Hilfe einiger user von http://www.autoit.de Forum umgesetzt, vielen Dank an Fabian, progandy und ideas2code.
    ;==========================================================================================================

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

    ;Recursive File Lister
    #include <Array.au3>
    #include <Date.au3>
    #include <file.au3>
    ;Main Programmm anfang

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

    ;deklaration der variablen
    Dim $FolderName = "E:\Autoit_testordner" ;Sagt welcher Ort zu durchsuchen ist
    Dim $FileCount = 0 ;setzt den zähler auf 0
    Dim $zeile = 10 ;setzen von size auf 10
    Dim $used = 0 ;setzen von used auf 0
    Dim $blocksize = 1 ;setzen von blocksize auf 1
    Dim $spalte = 2 ;setzen der spaltenanzahl auf 2
    Dim $avArray[$zeile][$spalte] ;erstellen eines arrays mit größe size und 2 spalte
    Dim $stop = "\STOPFILE.txt"
    Dim $Stoptext

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

    ScanFolder($FolderName) ;startet die durchsuchung des ortes
    MakeIndexFile($avArray) ;aufrufen von MakeIndexFile
    _ArrayDisplay($avArray, "Arrayinhalt") ;zeigt Fenster mit Arrayinhalt
    MsgBox(0, "Done", "Folder Scan Complete. Scanned " & $FileCount & " Files") ;Ausgabebox mit Meldung das durchsuchung fertig ist und wieviele dateien/ordner gefunden wurden

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

    ;Main Programm ende

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

    ;beginn des durchsuchungvorganges
    Func ScanFolder($SourceFolder)
    Local $Search
    Local $File
    Local $FileAttributes
    Local $FullFilePath

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

    ;schleife zur überprüfung der arraygröße
    If $used = $zeile Then ;wenn used gleich zeile und spalte ist
    $zeile = $zeile + $blocksize ;erweitern von size um blocksize
    ReDim $avArray[$zeile][$spalte] ;vergrößern des arrays
    EndIf
    ;schleifenende

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

    ;überprüfung ob sourcefolder schon vorhanden ist
    $avArray[$used][0] = $SourceFolder ;wenn arrayposition gleich SourceFolder ist
    $used = $used + 1 ;erweiter used um 1
    ;überprüfung ende

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

    $Stoptext = $SourceFolder & $stop
    $Search = FileFindFirstFile($SourceFolder & "\*.*") ;finde erste datei

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

    ;schleifenbeginn zum durchsuchen der ordner und schreiben in eine txt datei
    While 1
    If $Search = -1 Then ;wenn search nichts vorhanden ist dann
    ExitLoop ;dann verlasse schleife
    EndIf

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

    $File = FileFindNextFile($Search) ;nächste file finden
    If @error Then ExitLoop ;fehler = schleife verlassen

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

    $FullFilePath = $SourceFolder & "\" & $File ;zusammensetzen des pfades der datei
    $FileAttributes = FileGetAttrib($FullFilePath) ;attribute abfragen

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

    If StringInStr($FileAttributes, "D") Then ;überprüfe FileAttributes, wenn D(irectory) dann
    ScanFolder($FullFilePath) ;springe zu ScanFolder (schleife von vorne)
    Else
    LogFile($FullFilePath) ;gehe zu LogFile
    test($avArray, $FullFilePath)

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

    EndIf

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

    WEnd
    ;schleifenende

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

    FileClose($Search)
    EndFunc

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

    ;ende des durchsuchungvorganges

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

    ;beginn des vorganges zum schreiben in eine txt datei
    Func LogFile($FileName)
    FileWriteLine(@ScriptDir & "\FileList.txt", $FileName) ;Schreibe in Filelist.txt FileName
    $FileCount += 1 ;erhöhe FileCount um 1
    EndFunc
    ;ende des vorganges zum schreiben in eine txt datei

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

    Func test ($avArray, $FullFilePath)

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

    if FileExists ($Stoptext) then

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

    $Stopfile = fileopen ($Stoptext,0)
    $avArray[$used][1] = $Stopfile

    endif

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

    EndFunc

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

    ;beginn der erstellung einer HMTL datei mit Verlinkung zum Directory
    Func MakeIndexFile($avArray)
    Local $pos = 0
    Local $pos2 = 0
    Local $Nr = 1
    Local $Nr2 = 1
    Local $sType = 4

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

    $html = FileOpen(@ScriptDir & "\filelist.html", 2) ;Datei wird im Schreibmodus geöffnet, aktueller Inhalt wird gelöscht. Wenn die Datei nicht existiert wird sie erstellt.
    FileWriteLine(@ScriptDir & "\filelist.html", "<html>")
    FileWriteLine(@ScriptDir & "\filelist.html", "<head>")
    FileWriteLine(@ScriptDir & "\filelist.html", "<title>")
    FileWriteLine(@ScriptDir & "\filelist.html", "Laufwerkstand von " & $FolderName & " zuletzt ausgelesen am: " & _NowDate() & " um " & _NowTime($sType) & "</title>")

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

    FileWriteLine(@ScriptDir & "\filelist.html", "</head>")
    FileWriteLine(@ScriptDir & "\filelist.html", "<body bgcolor=" & '"' & '#' & "218429" & '"' & ">")
    FileWriteLine(@ScriptDir & "\filelist.html", "<p>" & "<font color=" & '"' & "#" & "FFFFFF" & '"' & ">" & "<B>" & "<TT>" & "<Font size =+2" & ">" & "Laufwerkstand von " & $FolderName & " zuletzt ausgelesen am: " & _NowDate() & " um " & _NowTime($sType) & "</font>" & "</TT>" & "<br>" & "</p>")
    FileWriteLine(@ScriptDir & "\filelist.html", "<table border=" & '"1"' & ">" & "<tr>" & "<th>" & "Nr." & "</th>" & "<th>" & "Pfad" & "</th>" & "<th>" & " &Ouml;ffnen" & "</th>" & "<th>" & "&Auml;ndern" & "</th>" & "</tr>")

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

    For $pos = 0 To UBound($avArray) - 1 ;forschleife zum auslesen des arrays
    FileWriteLine(@ScriptDir & "\filelist.html", "<p>" & "<tr>" & "<td>" & "<font color=" & '"' & "#" & "FFFFFF" & '"' & ">" & $Nr & ")" & "</td>" & "<td>" & "<font color=" & '"' & "#" & "FFFFFF" & '"' & ">" & $avArray[$pos][0] & "</td>" & "<td>" & "</font>" & "<a href=" & '"' & '#' & "AnkerNr" & $Nr & '"' & ">" & "<img src=" & '"' & "Folder_open.GIF" & '"' & "alt=" & '"' & "Open" & '"' & ">" & "</a>" & "</td>" & "<td>" & "<a href=" & '"' & $avArray[$pos][0] & '"' & ">" & "<img src=" & '"' & "Change_symbol.GIF" & '"' & "alt=" & '"' & "Change" & '"' & ">" & "</a>" & "</td>" & "</tr>" & "<p>")
    $Nr = $Nr + 1
    Next

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

    FileWriteLine(@ScriptDir & "\filelist.html", "</table>")
    FileWriteLine(@ScriptDir & "\filelist.html", "<br>" & "<br>" & "<br>" & "<br>" & "<br>")

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

    ;teil zum erstellen der detailanzeige
    FileWriteLine(@ScriptDir & "\filelist.html", "<B>" & "<big>" & "Übersicht" & "</B>" & "</big>")

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

    For $pos = 0 To UBound($avArray) -1
    FileWriteLine(@ScriptDir & "\filelist.html", "<p align=" & '"' & "left" & '"' & ">" & "<b>" & "<font color=" & '"' & "#" & "FFFFFF" & '"' & ">" & "<a name=" & '"' & "AnkerNr" & $Nr2 & '"' & ">" & $avArray[$pos][0] & "</a>" & "</b>" & "<br>")
    $Nr2 = $Nr2 + 1
    Next

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

    ;ende erstellung der detailanzeige

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

    FileWriteLine(@ScriptDir & "\filelist.html", "</body>")
    FileWriteLine(@ScriptDir & "\filelist.html", "</html>")
    FileClose($html)
    EndFunc
    ;ende der erstellung

    [/autoit]

    2 Mal editiert, zuletzt von Maurawani (8. September 2010 um 12:50)

  • Also den Code finde ich trotz Kommentaren und Formatierung sehr unleserlich.

    Wie gut bist du denn schon im Umgang mit autoit?
    Verstehst du die grundlegenden Dinge die du verwendest?
    Vor allem die Array's?

    Bei den Funktionen würde ich nicht Variablen auserhalb deklarieren und dann in mehreren Funktionen verwenden.
    So wie du es bei $used tust.

    Und ich würde immer bei Standard-Funktionen bleiben wenn diese ihren Zweck erfüllen.
    Für dein Programm denke ich tut es _FileListToArray auch.

  • Du bekommst die Fehlermeldung, weil fileopen die Datei nur öffnet aber nicht liest.
    Lt. Helpfile gibt fileopen "... ein Handle auf die Datei zurück, das für die folgenden Funktionen benötigt wird."
    Erst mit fileread wird der Inhalt der Datei gelesen.

    $used ist größer 9 (Du hast den Array mit 10 Zeilen definiert, aber Arrays sind "zero-based" also von 0-9) und damit willst Du eine Zeile außerhalb der Arraygrenzen ansprechen und das Handle der Eingabedatei zuweisen.

  • $used ist größer 9 (Du hast den Array mit 10 Zeilen definiert, aber Arrays sind "zero-based" also von 0-9) und damit willst Du eine Zeile außerhalb der Arraygrenzen ansprechen und das Handle der Eingabedatei zuweisen.

    $used erhöht sich aber in der rekursivensuche schon und sollte somit mitwachsen.

    Im Grunde will ich mein Script jetzt erweitern, wenn alles zugehörige zu "test" ausgeklammert werden, funktioniert alles ohne probleme.Hier zu sehen

  • Überprüf doch mal das Script mit _ArrayDisplay und ConsoleWrite oder MsgBox. Dann kann man schon die meisten Fehler erkennen.

  • $used erhöht sich aber in der rekursivensuche schon und sollte somit mitwachsen.

    $used mag sich zwar erhöhen, aber der Array wird deshalb nicht größer als Du ihn definiert hast (also 10 Zeilen). Wenn $used > 9 wird, dann musst Du den Array mit ReDim vergrößern. Aber Achtung: In einer Schleife frisst das Performance.
    Ich würde daher _FileReadToArray verwenden und dann den Zielarray weiterverarbeiten.

  • $used mag sich zwar erhöhen, aber der Array wird deshalb nicht größer als Du ihn definiert hast (also 10 Zeilen). Wenn $used > 9 wird, dann musst Du den Array mit ReDim vergrößern.

    Spoiler anzeigen
    [autoit]

    If $used = $zeile Then
    $zeile = $zeile + $blocksize
    ReDim $avArray[$zeile][$spalte]
    EndIf

    [/autoit]

    Aber Achtung: In einer Schleife frisst das Performance.
    Ich würde daher _FileReadToArray verwenden und dann den Zielarray weiterverarbeiten.

    Versuche derzeitig mal mit _FileReadToArray, kommt aber derzeitig genau das gleiche raus, probiere noch ein wenig weiter.

  • Wieso übergibst du denn $avArray als Parameter, wenn es sowieso Global ist?
    Und warum speicherst du denn das Handle von FileOpen? Ich dachte du wolltest den Inhalt der Datei speichern.

  • glaub ich verzettel mich selbst gerade extrem


    Jop glaub ich auch ^^

    Probier das mal, da bekommst du n sauberes Array:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    $pfad = FileSelectFolder("", @ScriptDir) & "\"
    $filelist = _FileListToArray($pfad)

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

    Dim $array[Ubound($filelist)][2]
    $array[0][0] = UBound($array) - 1
    For $i = 1 To $array[0][0]
    $array[$i][0] = $filelist[$i]
    $array[$i][1] = FileRead($pfad & $array[$i][0])
    Next
    _ArrayDisplay($array)

    [/autoit]
  • Da verweise ich gern nochmal auf Schnitzel's Post. Planung, Ordnung und Sauberkeit, ist das A und O beim programmieren. Am besten du nimmst nochmal dein letztes funktionierendes Script und veränderst es dann, so wie es jetzt eigentlich laufen sollte.

    Edit: Schnitzel's vorletzten Post.;)

  • bevor ich mich nochma so tief verzettel ^^ -glaube heut is net mein tag -
    also das script funktioniert einzelnd ja super. Aber glaube in der form für mein script nicht zu gebrauchen.

    Erkläre mal kurz was genau ich jetzt machen will, sonst wirds nen endlos thread ^^

    Mein Script bisher führt eine Rekursive Ordnerdurchsuchung durch und sammelt die einzelnden pfade im Array. Dann wird der Arrayinhalt für die HTML-erstellung genützt.
    In der HTML wird der Arrayinhalt einmal als tabelle (interne und externe verlinkung) und darunter ist der arrayinghalt ohne tabelle erzeugt. - erstmal das bisherige

    Jetzt der teil an dem ich mir die zähne ausbeiße, sozusagen.

    Ich möchte das er während der Ordnerdurchsuchung überprüft, ob in diesem aktuellen verzeichnis eine "Stopdatei" - im moment halt "STOPFILE.txt" - ist, wenn dort eine vorhanden ist, soll er die weiter Durchsuchung nach unterordner in diesem Verzeichnis lassen und den Inhalt der "Stopdatei" in der 2ten Spalte des Array einlesen. Diese soll nachher in die HTML datei mit eingebunden werden, dass unter dem ordnerpfad, wo die "Stopdatei" gefunden wurde, auch der inhalt der datei steht.

    Mein erster gedanke war das ganze als schleife zu machen, weshalb ich mich wahrscheinlich so verzettel hab beim implementieren in die vorhande whileschleife der rekursiven suche ^^

    So versuche mal weiter mein Glück und beginne mit der Planung des ganzen nochma ^^

    4 Mal editiert, zuletzt von Maurawani (8. September 2010 um 08:24)

  • so nun läuft es endlich wie es soll :D

    Danke an Water, M-Obi -für den hinweis doch mal das array anzeigen zu lassen für bessere fehlerfindung - und Schnitzel, vor allem an Schnitzel, für den kurzen knackigen quellcode den ich doch gebrauchen konnte - abgeändert natürlich - sagte ja gestern war einfach nicht mein tag :)

    Hier meine lösungsversion^^

    Spoiler anzeigen
    [autoit]

    $stop = $sourcefolder & "\STOPFILE.txt"
    if $fullfilepath == $stop then
    $used2 = $used
    $used2 = $used2 - 1
    $avarray[$used2][1] = FileRead ($stop)
    LogFile($FullFilePath)
    ExitLoop
    ElseIf StringInStr($FileAttributes, "D") Then
    ScanFolder($FullFilePath)
    endif

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


    Geht bestimmt noch eleganter, aber naja anfänger halt ^^

    mfg
    Maurawani :)

    3 Mal editiert, zuletzt von Maurawani (9. September 2010 um 08:15)