Bekannte Bugs in 3.3.8.1?

  • Wie ich feststellen musste funktionieren manche Skripte unter 3.3.8.1 nicht, welche aber bis 3.3.6.1 problemlos funktionierten. Mir ist dies bei Verwendung von

    [autoit]

    _Ftp_ListToArray2D

    [/autoit]

    aufgefallen siehe dazu [ offen ] Gesamten Ordner von FTP Server herunterladen welches bei mir(3.3.6.1) problemlos lief aber bei Fliwatt unter 3.3.8.1 nicht.

    Sind noch weitere solche Umstellschwierigkeiten besonders im SQLite-Bereich zu erwarten?

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (6. April 2012 um 20:50)

  • @Stay - Am besten mal den Ersteller der UDF kontaktieren, das ist keine AutoIt-Integriert entwickelte Funktion :D

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Ja klar aber ich meine da hilft es nicht an Jonathan Benneth zu reden, ich meinte man müsse eher den Entwickler der UDF kontaktieren ... nicht ?

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Es geht meiner Einschätzung nach hier um Bugs in der aktuellen AutoIt-Version, und da die GuiToolTip.au3 ein mitgeliefertes Include ist hat das hier doch durchaus seinen Platz? Man kontaktiert ja sonst auch das gesamte AutoIt-Team und nicht die einzelnen Ersteller?
    Die FTP(Ex).au3 wurde ja auch nicht von J.B. erstellt.

    Gruß stay

  • Mir ist aufgefallen, dass nach dem Update nur noch die Hälfte aller Skripte bei mir funktionierten.
    Das lag am geänderten Verhalten von Hex.

    Man musste jedes Hex(12345) durch ein Hex(Int(12345)) ersetzen, dann gings wieder.
    Was da konkret am Verhalten von Hex verändert wurde weiß ich nicht. Jedenfalls klappt nach der kleinen Anpassung wieder alles einwandfrei.

    Das kann aber der Gund sein, weshalb EVENTUELL irgendwelche UDFs nicht gehen. Hex kommt schließlich nicht soo selten vor.


    Eine weitere Sache (rekonstruierbar, aber nicht absichtlich herbeiführbar, da ich keine Ahnung habe woran es liegt) ist, dass Skripte manchmal einfach nicht funktionieren. (z.B. wenn ich an einem Skript am basteln bin und es mal starte. Dann erhalte ich einen Error ohne Debugmöglichkeiten. Also einfach nur eine seltsame negative Zahl.).
    Nach dem Ändern einer wirklich absolut unerheblichen Sache (z.B. Leerzeichen in einem String der per Tooltip angezeigt wird) funktioniert das Skript. Entfernt man das Leerzeichen stürzt es wieder sofort (oder nach ein Paar Zeilen) ab. So ein Problemskript hatte ich heute, hab aber leider versäumt es zu sichern. Ich schaue demnächst mal, dass ich mir sowas speichere. Vermutlich tritt das bei mir aber nie wieder auf... sehr selten)

    lg
    M

  • Ok, die bisherigen Beiträge veranlassen mich auch weiterhin auf 3.3.6.1 zu bleiben, trotzdem würde mich interessieren warum das im Eröffnungsbeitrag verlinkte Skript nicht geht? Hat es denn schon jemand getestet? Mein 1. Schluss aus den Fehlerbeschreibungen des Benutzers war das IsArray verbugt ist, nach dem ich aber eine andere Func _Ftp_ListToArray statt _Ftp_ListToArray2D genommen habe tritt der Array-Fehler nicht mehr auf. Vielleicht schaut sich ja einer der Pros das Skript an und erkennt in welcher benutzen Func der Bug liegt, denn es kann ja nicht sein dass ein 1D-Array korekt,ein 2D-Array aber trotz Fehlerbehandlung einen Fehler auslöst.

    '1D-Array
    [autoit]

    $aFiles = _Ftp_ListToArray($l_FTPSession, 2)
    If IsArray($aFiles) Then
    ;_ArrayDisplay($aFiles)
    If $aFiles[0] > 0 Then
    For $i = 1 To $aFiles[0]
    _ArrayAdd($aResult, $sPath & "/" & $aFiles[$i])
    ConsoleWrite("File: " & $sPath & "/" & $aFiles[$i] & @CRLF)
    Next
    EndIf
    EndIf

    [/autoit]
    2D-Array
    [autoit]

    $aFiles = _Ftp_ListToArray2D($l_FTPSession, 2)
    If IsArray($aFiles) Then
    ;_ArrayDisplay($aFiles)
    If $aFiles[0][0] > 0 Then ;hier tritt nach Angaben von Fliwatt unter 3.3.8.1 der Fehler auf der gar nicht vorkommen darf da ja 2 Zeilen zuvor geprüft wird ob es ein Array ist
    For $i = 1 To $aFiles[0][0]
    _ArrayAdd($aResult, $sPath & "/" & $aFiles[$i][0])
    ConsoleWrite($sPath & "/" & $aFiles[$i][0] & @CRLF)
    Next
    EndIf
    EndIf

    [/autoit]

    unter 3.3.6.1 laufen beide Versionen,

    mfg autoBert

  • Fehler tritt in der 3.3.8.1 bei mir ebenfalls auf.
    Es liegt aber nicht an isArray(). Beim Ausführen deines Beispiels zu _Ftp_ListToArray2D() reicht es schon, sich das _ArrayDisplay() anzuschauen. Man sieht ein 1dimensionales Array mit leeren Elementen. Da sagt isArray() natürlich OK aber der Zugriff auf $aArray[0][0] muss dennoch fehlschlagen.

    Das Problem liegt irgendwo in der internen Funktion __FTP_ListToArray() in der FTPEx.au3.
    Zum testen hab ich mal die Version aus einer 3.3.6.1 genommen und entsprechend in der 3.3.8.1 ersetzt.
    Siehe da, es geht wieder.

    Wenn man sich die beiden Versionen der Funktionen anschaut, hat sich da nicht allzu viel verändert aber wo da genau das Problem liegt vermag ich grad nicht zu erkennen. Ich wette Prog@ndy weiss es ;)

    __FTP_ListToArray() aus 3.3.6.1
    [autoit]

    ; #INTERNAL_USE_ONLY# ===========================================================================================================
    ; Name...........: __FTP_ListToArray
    ; Description ...:
    ; Syntax.........: __FTP_ListToArray($l_FTPSession, $Return_Type = 0, $l_Flags = 0, $bFmt = 1, $ArrayCount = 6)
    ; Parameters ....:
    ; Return values .: an 2D array with the requested info defined by $ArrayCount
    ; [0] Filename
    ; [1] Filesize
    ; [2] FileAttribute
    ; [3] File Modification time
    ; [4] File Creation time
    ; [5] File Access time
    ; Author ........: Beast, Prog@ndy
    ; Modified.......: jpm (to be use by external UDFs)
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func __FTP_ListToArray($l_FTPSession, $Return_Type = 0, $l_Flags = 0, $bFmt = 1, $ArrayCount = 6, $l_Context = 0)
    Local $tWIN32_FIND_DATA, $tFileTime, $IsDir, $callFindNext
    Local $DirectoryIndex = 0, $FileIndex = 0

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

    If $ArrayCount = 1 Then
    Local $FileArray[1], $DirectoryArray[1]
    Else
    Local $FileArray[1][$ArrayCount], $DirectoryArray[1][$ArrayCount]
    EndIf

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

    If $Return_Type < 0 Or $Return_Type > 2 Then Return SetError(1, 0, $FileArray)

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

    ;~ Global Const $tagWIN32_FIND_DATA = "DWORD dwFileAttributes; dword ftCreationTime[2]; dword ftLastAccessTime[2]; dword ftLastWriteTime[2]; DWORD nFileSizeHigh; DWORD nFileSizeLow; dword dwReserved0; dword dwReserved1; WCHAR cFileName[260]; WCHAR cAlternateFileName[14];"
    $tWIN32_FIND_DATA = DllStructCreate($tagWIN32_FIND_DATA)
    Local $callFindFirst = DllCall($__ghWinInet_FTP, 'handle', 'FtpFindFirstFileW', 'handle', $l_FTPSession, 'wstr', "", 'ptr', DllStructGetPtr($tWIN32_FIND_DATA), 'dword', $l_Flags, 'dword_ptr', $l_Context)
    If @error Or Not $callFindFirst[0] Then Return SetError(1, _WinAPI_GetLastError(), 0)

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

    Do
    $IsDir = BitAND(DllStructGetData($tWIN32_FIND_DATA, "dwFileAttributes"), $FILE_ATTRIBUTE_DIRECTORY) = $FILE_ATTRIBUTE_DIRECTORY
    If $IsDir And ($Return_Type <> 2) Then
    $DirectoryIndex += 1
    If $ArrayCount = 1 Then
    ReDim $DirectoryArray[$DirectoryIndex + 1]
    $DirectoryArray[$DirectoryIndex] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")
    Else
    ReDim $DirectoryArray[$DirectoryIndex + 1][$ArrayCount]
    $DirectoryArray[$DirectoryIndex][0] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")

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

    $DirectoryArray[$DirectoryIndex][1] = _WinAPI_MakeQWord(DllStructGetData($tWIN32_FIND_DATA, "nFileSizeLow"), DllStructGetData($tWIN32_FIND_DATA, "nFileSizeHigh"))
    If $ArrayCount = 6 Then
    $DirectoryArray[$DirectoryIndex][2] = DllStructGetData($tWIN32_FIND_DATA, "dwFileAttributes")

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

    $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastWriteTime"))
    $DirectoryArray[$DirectoryIndex][3] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
    $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftCreationTime"))
    $DirectoryArray[$DirectoryIndex][4] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
    $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastAccessTime"))
    $DirectoryArray[$DirectoryIndex][5] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
    EndIf
    EndIf
    ElseIf Not $IsDir And $Return_Type <> 1 Then
    $FileIndex += 1
    If $ArrayCount = 1 Then
    ReDim $FileArray[$FileIndex + 1]
    $FileArray[$FileIndex] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")
    Else
    ReDim $FileArray[$FileIndex + 1][$ArrayCount]
    $FileArray[$FileIndex][0] = DllStructGetData($tWIN32_FIND_DATA, "cFileName")

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

    $FileArray[$FileIndex][1] = _WinAPI_MakeQWord(DllStructGetData($tWIN32_FIND_DATA, "nFileSizeLow"), DllStructGetData($tWIN32_FIND_DATA, "nFileSizeHigh"))
    If $ArrayCount = 6 Then
    $FileArray[$FileIndex][2] = DllStructGetData($tWIN32_FIND_DATA, "dwFileAttributes")

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

    $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastWriteTime"))
    $FileArray[$FileIndex][3] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
    $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftCreationTime"))
    $FileArray[$FileIndex][4] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
    $tFileTime = DllStructCreate($tagFILETIME, DllStructGetPtr($tWIN32_FIND_DATA, "ftLastAccessTime"))
    $FileArray[$FileIndex][5] = _Date_Time_FileTimeToStr( $tFileTime ,$bFmt)
    EndIf
    EndIf
    EndIf

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

    $callFindNext = DllCall($__ghWinInet_FTP, 'bool', 'InternetFindNextFileW', 'handle', $callFindFirst[0], 'ptr', DllStructGetPtr($tWIN32_FIND_DATA))
    If @error Then Return SetError(2, _WinAPI_GetLastError(), 0)
    Until Not $callFindNext[0]

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

    DllCall($__ghWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $callFindFirst[0])
    ; No need to test @error.

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

    If $ArrayCount = 1 Then
    $DirectoryArray[0] = $DirectoryIndex
    $FileArray[0] = $FileIndex
    Else
    $DirectoryArray[0][0] = $DirectoryIndex
    $FileArray[0][0] = $FileIndex
    EndIf

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

    Switch $Return_Type
    Case 0
    If $ArrayCount = 1 Then
    ReDim $DirectoryArray[$DirectoryArray[0] + $FileArray[0] + 1]
    For $i = 1 To $FileIndex
    $DirectoryArray[$DirectoryArray[0] + $i] = $FileArray[$i]
    Next
    $DirectoryArray[0] += $FileArray[0]
    Else
    ReDim $DirectoryArray[$DirectoryArray[0][0] + $FileArray[0][0] + 1][$ArrayCount]
    For $i = 1 To $FileIndex
    For $j = 0 To $ArrayCount-1
    $DirectoryArray[$DirectoryArray[0][0] + $i][$j] = $FileArray[$i][$j]
    Next
    Next
    $DirectoryArray[0][0] += $FileArray[0][0]
    EndIf
    Return $DirectoryArray
    Case 1
    Return $DirectoryArray
    Case 2
    Return $FileArray
    EndSwitch
    EndFunc ;==>__FTP_ListToArray

    [/autoit]
  • Wenn man sich die beiden Versionen der Funktionen anschaut, hat sich da nicht allzu viel verändert aber wo da genau das Problem liegt vermag ich grad nicht zu erkennen. Ich wette Prog@ndy weiss es ;)


    Ich wusste es bis jetzt auch nicht. Schau es dir mit diff (bzw. Meld) an, dann siehst du, dass die ReDims geändert wurden und an ein paar Stellen wird die richtige Array-Dimension vergessen. In der Beta ist es bereits gefixt. Der korrigierte Teil:

    Spoiler anzeigen
    [autoit]

    Switch $Return_Type
    Case 0
    If $ArrayCount = 1 Then
    ReDim $DirectoryArray[$DirectoryArray[0] + $FileArray[0] + 1]
    For $i = 1 To $FileIndex
    $DirectoryArray[$DirectoryArray[0] + $i] = $FileArray[$i]
    Next
    $DirectoryArray[0] += $FileArray[0]
    Else
    ReDim $DirectoryArray[$DirectoryArray[0][0] + $FileArray[0][0] + 1][$ArrayCount]
    For $i = 1 To $FileIndex
    For $j = 0 To $ArrayCount - 1
    $DirectoryArray[$DirectoryArray[0][0] + $i][$j] = $FileArray[$i][$j]
    Next
    Next
    $DirectoryArray[0][0] += $FileArray[0][0]
    EndIf
    Return $DirectoryArray
    Case 1
    If $ArrayCount = 1 Then
    ReDim $DirectoryArray[$DirectoryIndex + 1]
    Else
    ReDim $DirectoryArray[$DirectoryIndex + 1][$ArrayCount]
    EndIf
    Return $DirectoryArray
    Case 2
    If $ArrayCount = 1 Then
    ReDim $FileArray[$FileIndex + 1]
    Else
    ReDim $FileArray[$FileIndex + 1][$ArrayCount]
    EndIf
    Return $FileArray
    EndSwitch

    [/autoit]