Hey,
ich hätte mal eine "allgemeine" Frage zu AutoIt. Ich habe zum "Spaß" mal _ArrayDelete() in einfach und für 1D-Arrays gebaut und wollte, weil ich eh immer ein "Temp-Array" brauche, einfach ein ganz neues Array "bauen", anstatt ReDim() zu nutzen^^...
Wenn Arrays lokal sind, "leben" sie ja auch nur, solange die Funktion genutzt wird, dann wird der Speicher wieder frei gegeben?
Und wenn ich ein altes Array überschreiben lasse, ist das alte auch im "Nirwana", oder?!
Func _ArrayDel($aArray, $iIndex)
If Not IsArray($aArray) Then Return 0
Local $iSize = UBound($aArray) - 1
If $iSize <= 0 Then Return 0
Local $aArrayNew[$iSize]
For $i = 0 To $iIndex - 1
$aArrayNew[$i] = $aArray[$i]
Next
For $i = $iIndex + 1 To $iSize
$aArrayNew[$i - 1] = $aArray[$i]
Next
Return $aArrayNew
EndFunc
So hatte ich mir das gedacht... Wo ist der Vorteil von "ReDim" und der Variante, wie das in der offiziellen UDF gemacht wird?^^ ReDim ist ja auch sehr rechenintensiv, müsste das so nicht eig. auch schneller sein?!^^ Was übersehe ich :P?
Ich habe mal von BugFix gelesen, wenn man ne UDF macht, sollte man ohne Includes arbeiten, sonst ist es unsauber xD... Und da ich grade ne _ArrayFilter/_ArrayClean (wie auch immer ich das dann nenne) - Funktion mache, wollte ich halt ein paar Funktionen "nachbauen"^^...
Spoiler anzeigen
Dim $a[6] = [1, "Test", "ABC", -5, "", " "]
_ArrayDis($a)
;~ $a = _ArrayClean($a, '\d+', 1) ; Entferne alle Zahlen aus dem Array
;~ $a = _ArrayClean($a, '-\d+', 0) ; Lasse nur alle neg. Zahlen im Array
$a = _ArrayClean($a, '[^\s]', 0) ; Lösche alle leeren Indizies
_ArrayDis($a)
; #FUNCTION# ====================================================================================================================
; Name ..........: _ArrayClean
; Description ...: Clean up an array.
; Syntax ........: _ArrayClean($aArray, $sPattern[, $bDel = 1])
; Parameters ....: $aArray - An array.
; $sPattern - The RegExp-Pattern.
; $bDel - [optional] Default is 1.
; 0 = Delete index, if string didnt match the pattern.
; 1 = Delete index, if string matched the pattern.
; Return values .: New Array
; 0 - If $aArray wasnt an array or all elements are deleted.
; Author ........: Acanis
; ===============================================================================================================================
Func _ArrayClean($aArray, $sPattern, $bDel = 1)
If Not IsArray($aArray) Then Return 0
Local $i
If $bDel Then
While $i < UBound($aArray)
If StringRegExp($aArray[$i], $sPattern, 0) Then
$aArray = _ArrayDel($aArray, $i)
Else
$i += 1
EndIf
Wend
Else
While $i < UBound($aArray)
If Not StringRegExp($aArray[$i], $sPattern, 0) Then
$aArray = _ArrayDel($aArray, $i)
Else
$i += 1
EndIf
Wend
EndIf
Return $aArray
EndFunc
Func _ArrayDel($aArray, $iIndex)
If Not IsArray($aArray) Then Return 0
Local $iSize = UBound($aArray) - 1
If $iSize <= 0 Then Return 0
Local $aArrayNew[$iSize]
For $i = 0 To $iIndex - 1
$aArrayNew[$i] = $aArray[$i]
Next
For $i = $iIndex + 1 To $iSize
$aArrayNew[$i - 1] = $aArray[$i]
Next
Return $aArrayNew
EndFunc
Func _ArrayDis($aArray)
If Not IsArray($aArray) Then Return MsgBox(4096, "Fehler", "Der übergebene Paramter ist kein Array!")
Local $sString = ""
For $i = 0 To UBound($aArray) - 1
$sString &= "|" & $aArray[$i] & "|" & @CRLF
Next
MsgBox(4096, "Dein Array", $sString)
EndFunc
Bin da auch gern für Verbesserungsvorschläge offen, wobei ich das für 2D-Arrays eh nochmal anpassen müsste, denke ich :P...
LG,
Aca