• Offizieller Beitrag

    Hi,
    und wieder was für meine Array-UDF-Sammlung ;)

    Im Hilfe-Forum war letztens das Thema Array splitten aktuell.
    Das habe ich zum Anlaß genommen und eine Splitfunktion erstellt.

    _Array2DSplit(ByRef $AR_SOURCE, ByRef $AR_TARGET, $iFROM=-1 [, $ANZ=-1])

    Die Variable für Ziel-Array muß auch als Array deklariert werden. Die Anzahl der Elemente spielt keine Rolle, die Größe wird innerhalb der Funktion angepaßt.

    - arbeitet mit 1D und 2D Arrays
    - Anzahl der Elemente in 2.ter Dimension beliebig

    - splittet ein Quell-Array ($AR_SOURCE) ab Array-Index ($iFROM)
    - Einträge vor Split-Index verbleiben im Quell-Array
    - Einträge ab Split-Index werden im Ziel-Array ($AR_TARGET) ausgegeben

    optional

    - es kann eine Anzahl ($ANZ) von Elementen ab Split-Index in das Ziel-Array ausgelagert werden
    - alle anderen Einträge verbleiben im Quell-Array


    Edit: Bugfix in der Fehlerroutine bei zu großem Wert für $ANZ

    Spoiler anzeigen
    [autoit]

    ;*******************************************************************************************************
    ; Funktion _Array2DSplit(ByRef $AR_SOURCE, ByRef $AR_TARGET, $iFROM=-1 [, $ANZ=-1])
    ;
    ; Beschreibung Splittet ein 1D/2D Array ab Indexposition, optional wird Anzahl Einträge ausgelagert
    ;
    ; Parameter $AR_SOURCE Array mit Ausgangsdaten
    ; $AR_TARGET Array mit abgesplitteten Daten
    ; $iFROM Index ab dem gesplittet wird
    ; optional $ANZ Anzahl Elemente, die abgesplittet werden sollen
    ;
    ; Rückgabe Erfolg -1
    ; Fehler 0 @error = 1 Ausgangsvariablen sind keine Arrays
    ; @error = 2 kein Startindex oder Index außerhalb Bereich
    ;
    ; Autor BugFix ([email='bugfix@autoit.de'][/email])
    ;*******************************************************************************************************
    Func _Array2DSplit(ByRef $AR_SOURCE, ByRef $AR_TARGET, $iFROM=-1, $ANZ=-1)
    If ( Not IsArray($AR_SOURCE) ) Or ( Not IsArray($AR_TARGET) ) Then
    SetError(1)
    Return 0
    EndIf
    If $ANZ = -1 Then $ANZ = UBound($AR_SOURCE)-$iFROM
    If ( $iFROM < 0 ) Or ( $iFROM > UBound($AR_SOURCE)-1 ) Or ( $ANZ < 1 ) Or ( $ANZ > (UBound($AR_SOURCE)-$iFROM) ) Then
    SetError(2)
    Return 0
    EndIf
    Local $UBound2nd = UBound($AR_SOURCE,2)
    If @error = 2 Then
    Local $arTMP[1]
    ReDim $AR_TARGET[$ANZ]
    ReDim $arTMP[UBound($AR_SOURCE)-$ANZ]
    For $k = 0 To $iFROM-1
    $arTMP[$k] = $AR_SOURCE[$k]
    Next
    $j = 0
    For $i = $iFROM To $iFROM+$ANZ-1
    $AR_TARGET[$j] = $AR_SOURCE[$i]
    $j += 1
    Next
    For $i = $iFROM+$ANZ To UBound($AR_SOURCE)-1
    $arTMP[$k] = $AR_SOURCE[$i]
    $k +=1
    Next
    $AR_SOURCE = $arTMP
    Return -1
    Else
    Local $arTMP[1][$UBound2nd]
    ReDim $AR_TARGET[$ANZ][$UBound2nd]
    ReDim $arTMP[UBound($AR_SOURCE)-$ANZ][$UBound2nd]
    For $k = 0 To $iFROM-1
    For $i = 0 To $UBound2nd-1
    $arTMP[$k][$i] = $AR_SOURCE[$k][$i]
    Next
    Next
    $j = 0
    For $i = $iFROM To $iFROM+$ANZ-1
    For $l = 0 To $UBound2nd-1
    $AR_TARGET[$j][$l] = $AR_SOURCE[$i][$l]
    Next
    $j += 1
    Next
    For $i = $iFROM+$ANZ To UBound($AR_SOURCE)-1
    For $l = 0 To $UBound2nd-1
    $arTMP[$k][$l] = $AR_SOURCE[$i][$l]
    Next
    $k +=1
    Next
    $AR_SOURCE = $arTMP
    Return -1
    EndIf
    EndFunc ;==>_Array2DSplit

    [/autoit]
  • Ich muss den mal rauskramen ...
    Weil irgendwie funzt der nicht, oder ich habe nicht verstanden wie das laufen soll...

    [autoit]

    Dim $XML, $XML2
    _FileReadToArray("E:\test.xml", $XML)
    _Array2DSplit($XML, $XML2, 3)
    _ArrayDisplay($XML)
    _ArrayDisplay($XML2)

    [/autoit]


    Das ganz will bei mir nicht laufen ...

    Einmal editiert, zuletzt von Zen (11. Juli 2007 um 12:25)

    • Offizieller Beitrag

    Zitat aus meiner Funktionsbeschreibung:

    Zitat

    Die Variable für Ziel-Array muß auch als Array deklariert werden.

    Also muß dein Code so aussehen:

    [autoit]


    Dim $XML, $XML2[1] ; tatsächliche Größe paßt die Funktion an
    _FileReadToArray("E:\test.xml", $XML)
    _Array2DSplit($XML, $XML2, 3)
    _ArrayDisplay($XML)
    _ArrayDisplay($XML2)

    [/autoit]