Debughilfe gesucht: Subscript used with non-Array variable

  • Hi Forum,
    ich bräuchte etwas Hilfe beim Debuggen meiner kleinen Suchroutine.
    Ich stehe gerade zeimlich aufm Schlauch, vezeiht mir also bitte Flüchtigkeitsfehler :whistling:

    Hier ist der Scite-Console Output:

    Code
    If $DirSize[0] = 0 Then
    If $DirSize^ ERROR

    Obwohl ich $DirSize als Array definiert habe und die Flag 1 der Fkt. sagt, dass sie ein Array zurrückgeben soll, bekomme ich folgenden Error:

    Code
    Subscript used with non-Array variable

    Hier mein Script:

    [autoit]

    Func _ScanForDirs($SourceFolder)
    Dim $FolderList[1000]
    Dim $i
    Dim $DirSize[3]

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

    $FolderList = _FileListToArray($SourceFolder,"*",2)
    ;_ArrayDisplay($FolderList)
    For $i = 1 To $FolderList[0]
    $DirSize = DirGetSize($FolderList[$i],1)
    If $DirSize[0] = 0 Then
    _Log($SourceFolder & "\" & $FolderList[$i],0)
    ElseIf $DirSize[1] > 0 Then
    _ScanForFiles($SourceFolder & "\" & $FolderList[$i])
    ElseIf $DirSize[2] > 0 Then
    _Log($SourceFolder & "\" & $FolderList[$i],1)
    _ScanForDirs($SourceFolder & "\" & $FolderList[$i])
    EndIf
    Next
    EndFunc

    [/autoit]

    Danke für eure Hilfe,
    MfG
    d3ll_s0ul

    Einmal editiert, zuletzt von d3ll_s0ul (19. Juli 2010 um 16:33)

  • Setze ein

    [autoit]

    _ArrayDisplay($DirSize)

    [/autoit]

    nach

    [autoit]

    $DirSize = DirGetSize($FolderList[$i],1)

    [/autoit]

    ein und du solltest dem Übeltäter auf die Spur kommen,

    mfg (Auto)Bert

  • DirGetSize gibt kein Array zurück - also machst du aus einem Array wieder eine ganz normale Variable.

    Zitat von "Hilfe: DirGetSize"

    path Der Pfad des zu untersuchenden Verzeichnisses, z.B. "C:\Windows".
    flag [optional] Dieses Flag bestimmt das Verhalten und Ergebnis der Funktion und kann eine Kombination der folgenden Werte sein:
    0 = (Standard)
    1 = aktiviert den erweiterten Modus ("Extended mode") -> Es wird ein Array zurückgegeben, das weitere Informationen enthält (siehe Bemerkungen).
    2 = beziehe Dateien in Unterverzeichnissen nicht mit ein (der Rekursivmodus ist aus).

  • Sprenger120: Anbei das komplette Script, sammt _Log

    [autoit]

    Func _ScanForDirs($SourceFolder)
    Dim $FolderList[1000]
    Dim $i
    Dim $DirSize[3]

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

    $FolderList = _FileListToArray($SourceFolder,"*",2)
    ;_ArrayDisplay($FolderList)
    For $i = 1 To $FolderList[0]
    $DirSize = DirGetSize($FolderList[$i],1)
    If $DirSize[0] = 0 Then
    _Log($SourceFolder & "\" & $FolderList[$i],0)
    ElseIf $DirSize[1] > 0 Then
    _ScanForFiles($SourceFolder & "\" & $FolderList[$i])
    ElseIf $DirSize[2] > 0 Then
    _Log($SourceFolder & "\" & $FolderList[$i],1)
    _ScanForDirs($SourceFolder & "\" & $FolderList[$i])
    EndIf
    Next
    EndFunc

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

    Func _Log($expr,$mode)
    Switch $mode
    Case 1
    FileWriteLine("test.txt",$expr)
    Case 0
    FileWriteLine("test.txt",$expr & " is empty!")
    EndSwitch
    EndFunc

    [/autoit]

    autoBert: Hatte ich auch schon probiert, schmeißt aber @error, da $DirSize kein Array zu sein scheint...

    AspirinJunkie: Aus Autoit.chm:

    Code
    Wenn man den erweiterten Modus verwendet, wird ein 1-dimensionales Array mit folgenden Elementen zurückgegeben:$array[0] = Größe$array[1] = Anzahl der Dateien$array[2] = Anzahl der Verzeichnisse

    Sprenger120 war schneller ;)

  • AspirinJunkie: alles schon gemacht, @error = 1 -> Pfad existiert nicht...
    Edit: Ahaaa, DirGetSize braucht den vollständigen Pfad, script läuft soweit in dieser Form:

    [autoit]

    _ScanForDirs("X:\CopyClip")

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

    Func _ScanForFiles($SourceFolder)
    Dim $FileList[1000]
    Dim $i

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

    $FileList = _FileListToArray($SourceFolder,"*",1)
    If @error = 4 Then _ScanForDirs($SourceFolder)
    For $i = 1 To $FileList[0]
    _Log($SourceFolder & "\" & $FileList[$i],1)
    Next
    EndFunc

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

    Func _ScanForDirs($SourceFolder)
    Dim $FolderList[1000]
    Dim $i
    Dim $DirSize[3]

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

    $FolderList = _FileListToArray($SourceFolder,"*",2)
    ;_ArrayDisplay($FolderList)
    For $i = 1 To $FolderList[0]
    $DirSize = DirGetSize($SourceFolder & "\" & $FolderList[$i],1)
    If $DirSize[0] = 0 Then
    _Log($SourceFolder & "\" & $FolderList[$i],0)
    ElseIf $DirSize[1] > 0 Then
    _ScanForFiles($SourceFolder & "\" & $FolderList[$i])
    ElseIf $DirSize[2] > 0 Then
    _Log($SourceFolder & "\" & $FolderList[$i],1)
    _ScanForDirs($SourceFolder & "\" & $FolderList[$i])
    EndIf
    Next
    EndFunc

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

    Func _Log($expr,$mode)
    Switch $mode
    Case 1
    FileWriteLine("test.txt",$expr)
    Case 0
    FileWriteLine("test.txt",$expr & " is empty!")
    EndSwitch
    EndFunc

    [/autoit]

    Jetzt taucht aber das hier auf:

    Code
    17) : ==> Subscript used with non-Array variable
    For $i = 1 To $FileList[0]
    For $i = 1 To $FileList^ ERROR

    Ideen?
    MfG
    d3ll_s0ul

    Einmal editiert, zuletzt von d3ll_s0ul (19. Juli 2010 um 16:29) aus folgendem Grund: Gedankblitz, danke an AspirinJunkie!!!

  • Na dann hast du doch schon den Ansatz.
    An deinen Pfaden stimmt was nicht.
    Ich würde spontan behaupten du müsstest es so schreiben:

    Code
    $DirSize = DirGetSize($SourceFolder & "\" & $FolderList[$i],1)


    Denn woher soll das Programm wissen in welchem Pfad sich der Ordner mit dem Namen in $FolderList[$i] befindet?
    standardmäßig wird er das @WorkingDir nehmen - aber das ist in der Regel das Skriptverzeichnis.

  • So suchter alle Unterordner. Funzt habs ebend getestet. Ist aber recht langsam.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    Dim $aFolderList[1] = [0]

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

    Func _ScanForDirs($SourceFolder)
    $aTmpList = _FileListToArray($SourceFolder, "*", 2)

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

    ;_ArrayDisplay($FolderList)
    For $i = 1 To $aTmpList[0]

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

    ReDim $aFolderList[UBound($aFolderList)+1]
    $aFolderList[$aFolderList[0]] = $SourceFolder & "\" & $aTmpList[$i]
    $aFolderList[0] += 1

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

    $DirSize = DirGetSize($SourceFolder & "\" & $aTmpList[$i], 1)

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

    If Not IsArray($DirSize) Then ContinueLoop

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

    If $DirSize[2] > 0 Then _ScanForDirs($SourceFolder & "\" & $aTmpList[$i])
    Next
    EndFunc ;==>_ScanForDirs
    _ScanForDirs(@WindowsDir)
    _ArrayDisplay($aFolderList)

    [/autoit]
  • juet, danke schonmal bis hierher an alle für die schnelle und kompetente hilfe!
    ich beende das ganze hier mal, den rest sollte ich schon alleine hinbekommen!
    MfG
    d3ll_s0ul

  • Hallo d3ll_s0ul,

    hier dein Original-Skript überarbeitet:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <array.au3>

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

    $sLog = @ScriptDir & "\test.txt"

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

    If FileExists($sLog) Then FileDelete($sLog)

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

    _ScanForDirs("C:\Programme\AutoIt3")

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

    Func _ScanForFiles($SourceFolder)
    Dim $FileList[1000]
    Dim $i

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

    $FileList = _FileListToArray($SourceFolder, "*", 1)
    If @error = 4 Then _ScanForDirs($SourceFolder)
    If IsArray($FileList) Then
    For $i = 1 To $FileList[0] - 1
    _Log($SourceFolder & "\" & $FileList[$i], 1)
    Next
    EndIf
    EndFunc ;==>_ScanForFiles

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

    Func _ScanForDirs($SourceFolder)
    ;ConsoleWrite($SourceFolder & @CRLF)
    $FolderList = _FileListToArray($SourceFolder, "*.*");, 2)
    If IsArray($FolderList) Then
    ;_ArrayDisplay($FolderList)
    For $i = 1 To $FolderList[0] - 1
    $DirSize = DirGetSize($SourceFolder & "\" & $FolderList[$i], 1)
    If IsArray($DirSize) Then
    ;_ArrayDisplay($DirSize)
    If $DirSize[0] = 0 Then
    _Log($SourceFolder & "\" & $FolderList[$i], 0)
    Else
    If $DirSize[1] > 0 Then _ScanForFiles($SourceFolder & "\" & $FolderList[$i])
    If $DirSize[2] > 0 Then
    _Log($SourceFolder & "\" & $FolderList[$i], 1)
    _ScanForDirs($SourceFolder & "\" & $FolderList[$i])
    EndIf
    EndIf
    EndIf
    Next
    EndIf
    EndFunc ;==>_ScanForDirs

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

    Func _Log($expr, $mode)
    Switch $mode
    Case 1
    FileWriteLine($sLog, $expr)
    Case 0
    FileWriteLine($sLog, $expr & " is empty!")
    EndSwitch
    EndFunc ;==>_Log

    [/autoit]

    läuft relativ zügig.

    mfg (Auto)Bert