Wert wird nicht in Variable gespeichert?

  • Hi,

    ich hab ein Array global deklariert

    [autoit]

    Global $FileName[100]

    [/autoit]

    In einem Switch-Case Fall werden darin Werte gespeichert, diese Werte sind dann auch im Array vorhanden (laut Debug). Wenn ich die Werte des Arrays aber in einem anderen Switch-Case Fall wieder aufrufen will wird auf einmal kein Wert mehr zurückgegeben.

    [autoit]


    Case $btn_AddFile
    $FileArray[$FileCounter] = $InputFile
    $FileName[$FileCounter] = GetFileName($InputFile)
    Case $btn_MakeArchive
    _BuildInZIP($GetArchivePath & "\" & $FileName[$counter], $FileArray[$counter])

    [/autoit]

    Einmal editiert, zuletzt von CrazyAutoIT (24. Juni 2013 um 20:27)

  • Hallo CrazyAutoIT,

    Vielleicht postest du mal etwas mehr Code als diesen kleinen Ausschnitt, zum Beispiel, wie du $counter und $FileCounter initialisierst und änderst.

    An dem bisherigen Codeausschnitt kann man leider nicht viel erkennen... ;)

    MfG Xenon

  • Dann hat wohl $counter einen anderen Wert als $FileCounter.
    Lass dir die beiden doch mal ausgeben und vergleich sie.
    du kannst dir auch die Arrays mit _ArrayDisplay ausgeben lassen. (Falls du nicht weißt wo was steht...)

    Ps: wenn du den Ganzen dateipfad hast dann bekommst du den Dateinamen auch sehr schnell so:

    [autoit]

    StringTrimLeft($FileArray[$FileCounter], StringInStr($FileArray[$FileCounter], '\', Default, -1))

    [/autoit]


    Ich würde an deiner Stelle nicht mit 2 Array's rumbasteln ;)

  • Zitat

    Dann hat wohl $counter einen anderen Wert als $FileCounter.

    Nein, hab sie mir per Debug to MsgBox ausgeben lassen, beide geben 0 zurück (damit wird das erste Element in dem Array ausgewählt). Das dürfte so passen.

    Zitat

    An dem bisherigen Codeausschnitt kann man leider nicht viel erkennen...

    Okay sorry:

    Hier was in FileArray[] geschrieben wird:

    [autoit]


    $FileCounter = _GUICtrlListView_GetItemCount($ListView1)
    $InputFile = FileOpenDialog("Gepackte Dateien speichern...", "Bibliotheken\Dokumente", "Alle Dateien (*.*)|Archive (*.zip)")
    $FileArray[$FileCounter] = $InputFile

    [/autoit]

    FileName hab ich jetzt weggelassen da man das wirklich aus FileArray auslesen kann (danke Schnitzel :))

    Hier das ganze für $counter:

    [autoit]


    For $counter = 0 To _GUICtrlListView_GetItemCount($ListView1) - 1
    _BuildInZIP($GetArchivePath & "\" & GetFileName($FileArray[$counter]), $FileArray[$counter])
    Next

    [/autoit]
  • Du schreibst in

    $FileArray[_GUICtrlListView_GetItemCount($ListView1)], liest aber bis maximal

    $FileArray[_GUICtrlListView_GetItemCount($ListView1) -1] (bis dahin geht die For-Schleife), also einen Index niedriger aus.

    Dann kann doch nicht das richtige Ergebnis kommen. ;)

    MfG Xenon

  • [autoit]


    For $counter = 0 To _GUICtrlListView_GetItemCount($ListView1)
    _BuildInZIP($GetArchivePath & "\" & GetFileName($FileArray[$counter]), $FileArray[$counter])
    Next

    [/autoit]

    So funktionierts aber auch nicht :( :

    [autoit]

    $FileArray[$counter]

    [/autoit]


    Gibt nichts zurück.

    Seltsamerweise führt ein "Debug to MsgBox" auf $counter dazu, dass einmal eine MsgBox mit dem Return-Wert "0" und dann gleich wieder eine mit dem Return-Wert "1" aufgeht?

  • Seltsamerweise führt ein "Debug to MsgBox" auf $counter dazu, dass einmal eine MsgBox mit dem Return-Wert "0" und dann gleich wieder eine mit dem Return-Wert "1" aufgeht?


    Du hast ja auch eine For-Schleife, die $counter auf 0 setzt und dann immer um 1 erhöht, bis $counter = ...ItemCount($ListView1).
    (schau dir mal For-Schleifen in der Hilfe an)

    Probier doch mal:

    [autoit]

    $FileCounter = _GUICtrlListView_GetItemCount($ListView1)
    $InputFile = FileOpenDialog("Gepackte Dateien speichern...", "Bibliotheken\Dokumente", "Alle Dateien (*.*)|Archive (*.zip)")
    $FileArray[$FileCounter] = $InputFile
    $counter = _GUICtrlListView_GetItemCount($ListView1)
    _BuildInZIP($GetArchivePath & "\" & GetFileName($FileArray[$counter]), $FileArray[$counter])

    [/autoit]


    (das ist ohne Schleife und nur zum Test ;) )

    MfG Xenon

  • [autoit]


    $counter = _GUICtrlListView_GetItemCount($ListView1) - 1
    _BuildInZIP($GetArchivePath & "\" & GetFileName($FileArray[$counter]), $FileArray[$counter])

    [/autoit]

    -1 deswegen weil sonst 1 zurückgegeben wird. $counter ist 0, $FileArray[$counter] gibt aber immer noch nichts zurück.

  • Aber dann müsstest du doch bei

    [autoit]

    $FileCounter = _GUICtrlListView_GetItemCount($ListView1)

    [/autoit]

    auch eine "-1" dranhängen, da das sonst auch "1" ist.


    Versuch mal:

    [autoit]

    $FileCounter = _GUICtrlListView_GetItemCount($ListView1)
    $InputFile = FileOpenDialog("Gepackte Dateien speichern...", "Bibliotheken\Dokumente", "Alle Dateien (*.*)|Archive (*.zip)")
    $FileArray[$FileCounter] = $InputFile
    $counter = _GUICtrlListView_GetItemCount($ListView1)
    MsgBox (0, "", "FileCounter:" & $FileCounter & " counter:" & $counter & " FileArray[$FileCounter]:" & $FileArray[$FileCounter] & " FileArray[$counter]:" & $FileArray[$counter])

    [/autoit]

    Und sag mal, was ausgegeben wird.

    MfG Xenon

  • Zitat

    auch eine "-1" dranhängen, da das sonst auch "1" ist.

    Nein da der Wert zugewiesen wird bevor überhaupt ein Element der ListView hinzugefügt wird (siehe Post #4).

    Zitat

    Versuch mal:

    $counter = 0

    Also muss das Array irgendwie auf der Strecke der einzelnen Switch-Case Anweisungen verloren gegangen sein :(

  • Nein da der Wert zugewiesen wird bevor überhaupt ein Element der ListView hinzugefügt wird (siehe Post #4).


    Ich sehe nicht, dass da ein Element hinzugefügt wird... ?(

    $counter = 0

    Also muss das Array irgendwie auf der Strecke der einzelnen Switch-Case Anweisungen verloren gegangen sein :(

    Nein, das heißt, dass das "ListView" 0 Elemente hat...
    Fügst du da überhaupt welche hinzu ?

  • Zitat

    Nein, das heißt, dass das "ListView" 0 Elemente hat...
    Fügst du da überhaupt welche hinzu ?


    Jop.

    Ein Debug auf

    [autoit]

    _GUICtrlListView_GetItemCount($ListView1)

    [/autoit]

    zeigt das auch.

  • Okay:

    [autoit]


    While 1
    $nMsg = GUIGetMsg()
    Global $FileArray[100]
    Dim $GetArchivPath
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btn_AddFile
    $FileCounter = _GUICtrlListView_GetItemCount($ListView1)
    $InputFile = FileOpenDialog("Gepackte Dateien speichern...", "Bibliotheken\Dokumente", "Alle Dateien (*.*)|Archive (*.zip)")
    $FileArray[$FileCounter] = $InputFile
    If StringLen($InputFile) <> 0 Then
    GUICtrlCreateListViewItem(GetFileName($FileArray[$FileCounter]), $ListView1)
    _GUICtrlListView_AddSubItem($ListView1, $FileCounter, $FileCounter + 1, 1)
    EndIf
    Case $btn_PathArchive
    GUICtrlSetData($btn_PathArchive, "...Durchsuchen")
    $GetArchivePath = FileSelectFolder("Platz zum speichern der Archive auswählen...", "C:\Users\" & @UserName & "\Desktop", "Alle Dateien (*.*)")
    If StringLen($GetArchivePath) = 0 Then
    GUICtrlSetData($btn_PathArchive, "...Durchsuchen")
    Else
    GUICtrlSetData($btn_PathArchive, $GetArchivePath)
    EndIf
    Case $btn_MakeArchive
    If _GUICtrlListView_GetItemCount($ListView1) = 0 Then
    MsgBox(64, "Fehlende Dateien!", "Bitte zuerst Dateien der Liste hinzufügen!")
    Else
    $counter = _GUICtrlListView_GetItemCount($ListView1) - 1
    _BuildInZIP($GetArchivePath & "\" & GetFileName($FileArray[$counter]), $FileArray[$counter])
    ;For $counter = 0 To _GUICtrlListView_GetItemCount($ListView1) - 1
    ; _BuildInZIP($GetArchivePath & "\" & GetFileName($FileArray[$counter]), $FileArray[$counter])
    ;Next
    EndIf
    EndSwitch
    WEnd

    [/autoit]
  • Hi,
    das Array ist definitiv verloren gegangen, und zwar, weil es bei jedem Schleifendurchlauf while/wend neu initialisiert wird...

    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Global $FileArray[100]
    Dim $GetArchivPath

    [/autoit]
  • Sinnvoller wäre es auch, wenn du am Anfang alle Variablen deklarierst, also nach den Includes. Dann entstehen auch nicht solche Schusslichkeitsfehler. Wann nimmst du denn Global, Dim und Local?

  • Zitat

    Und das Ganze hättest Du auch zwei Stunden eher haben können, wenn Du gleich mehr gepostet hättest.

    Ich wollt halt nicht gleich meinen ganzen ultra coolen Code herzeigen :love:

    Zitat

    Bitte noch das Thema auf "gelöst" setzen (1. Beitrag bearbeiten).

    Hab da (leider) noch ne Frage:

    Ich würde gerne am Ende (nachdem die ganzen Files gepackt wurden) eine Liste ausgeben mit den Dateien, die gepackt wurden. Dazu deklariere ich ein globales Array, nach jedem Durchlauf der For-Schleife wird in das Array der Datei-Name geschrieben.
    Nach dem die For-Schleife durch ist übergebe ich das Array einer Funktion die alle Array-Elemente zu einem String verkettet (der Übersichtlichkeit wegen am Ende mit einem NewLine). Trotdzem übergebe ich anscheinend ein leeres Array :(

    [autoit]


    For $counter = 0 To _GUICtrlListView_GetItemCount($ListView1) - 1
    _BuildInZIP($GetArchivePath & "\" & GetFileName($FileArray[$counter]) & ".zip", $FileArray[$counter])
    $PassedFiles[$counter] = GetFileName($FileArray[$counter])
    Next
    MsgBox(64, "Archive wurden erstellt.", "Archive wurden für: " & OneD_ArrayIntoString($PassedFiles) & " erstellt!")
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$PassedFiles' & @lf & @lf & 'Return:' & @lf & $PassedFiles) ;### Debug MSGBOX

    [/autoit]

    Funktion:

    [autoit]


    Func OneD_ArrayIntoString(ByRef $Array)
    Dim $String
    For $counter = 0 To UBound($Array) - 1
    $String = $String + $Array[$counter] + @LF
    Next
    Return $String
    EndFunc

    [/autoit]

    Die Variable $PassedFiles wird an der selben Stelle wie $FileArray deklarier (also direkt unter den #includes). Wahrscheinlich handelt es sich hier wieder um einen Flüchtigkeitsfehler, aber logische Fehler findet man ja nicht :whistling: