Variable will nicht deklariert sein (bestimmt schnell gelöst)

  • Hi Leute,

    wieso wird die Variable $o nicht in der Funktion erkannt, obwohl sie "Global" ist?

    [autoit]


    #include <array.au3>
    $test = _OrdnerRekursiv("C:\Neuer Ordner")
    _ArrayDisplay($test)

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

    Dim $Ergebnis[1][2]
    Global $f = 0, $o = 0, $a = 0
    Func _OrdnerRekursiv($sPfad)
    $FFFF = FileFindFirstFile($sPfad)
    If $FFFF <> -1 Then
    While 1
    $File = FileFindNextFile($FFFF)
    If @extended = 1 Then
    $o += 1
    FileWrite(@TempDir & "\" & $o & ".ord", $File)
    ElseIf Not @error Then
    $f += 1
    ReDim $Ergebnis[$f + 1][2]
    If StringInStr($File, "/") <> 0 Then
    $NeuFile = StringSplit($File, "/")
    Else
    $NeuFile = StringSplit($File, "\")
    EndIf
    $Name = $NeuFile[UBound($NeuFile)]
    $Ergebnis[$f + 1][0] = $Name
    $Ergebnis[$f + 1][1] = $File
    Else
    ExitLoop
    EndIf
    WEnd
    EndIf
    While 1
    $a += 1
    $sPfad = FileRead(@TempDir & "\" & $a & ".ord")
    If @error Then
    Return $Ergebnis
    ExitLoop
    EndIf
    _OrdnerRekursiv($sPfad)
    WEnd
    EndFunc ;==>_OrdnerRekursiv

    [/autoit]

    Vielen Dank für eure Antwort
    Aquaplant

    Einmal editiert, zuletzt von Aquaplant (18. Dezember 2010 um 16:53)

  • Besser wäre aber als local definiert IN die Funktionsdefinition da die Variablen nur dort benötigt werden.
    Die Array-Deklaration auch lieber gleich mit Global bzw. Local in der Funktion machen.
    Dim sollte vermieden werden.

    Edit: Ah ok - du definierst das Array außerhalb um in allen Rekursionsaufrufen auf die gleiche Variable zuzugreifen?
    Dies lässt sich mit dem KeyWord Static ebenfalls erreichen und die Variable bleibt dennoch in der Funktion gekapselt.

    Edit 2: Wobei zumindestens beim Array durch einen Bug in AutoIt eine Größenänderung von Static Arrays momentan nicht möglich ist. In dem Fall muss man sich also anders behelfen.

    Einmal editiert, zuletzt von AspirinJunkie (18. Dezember 2010 um 16:58)

  • Edit 2: Wobei zumindestens beim Array durch einen Bug in AutoIt eine Größenänderung von Static Arrays momentan nicht möglich ist. In dem Fall muss man sich also anders behelfen.


    Dafür habe ich mal ein Workaround erarbeitet:

    [autoit]

    #include <Array.au3>

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

    _StaticArrayRedimTest()
    _StaticArrayRedimTest()

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

    Func _StaticArrayRedimTest()
    Local Static $aArray ; Static Array als normale Variable anlegen
    Local $aDummy[3] = [1,2,3] ; Dummy Array beinhaltet Standardwerte des Static Arrays.

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

    If Not IsArray($aArray) Then $aArray = $aDummy ; Dummy Array übertragen, wenn der Static Array noch kein Array ist.
    Local $iUbound = UBound($aArray)

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

    ; Über den Dummy Array vergrößern
    $aDummy = $aArray
    ReDim $aDummy[$iUbound + 1]
    $aArray = $aDummy

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

    $aArray[$iUbound] = Random(1, 999)
    _ArrayDisplay($aArray)
    EndFunc ;==>_StaticArrayRedimTest

    [/autoit]
  • Danke, hatte es jetzt schon doch schneller als gedacht so erledigt:

    [autoit]

    If IsDeclared("f") = 0 Then
    Global $Ergebnis[1][2], $Parameter
    Global $f = 0, $o = 0, $a = 0, $bed
    FileDelete(@TempDir & "\*.ord")
    EndIf

    [/autoit]


    Aber vielen Dank :)