Jump to content

Recommended Posts

Posted (edited)
; #FUNCTION# ===================================================================
; Name ..........: _ArrayCopyRange
; Description ...: Copies a specified range between 1D/2D arrays with index control
; Syntax ........: _ArrayCopyRange(ByRef $aArray, Const ByRef $aArrayToCopy, $iStart_Row = Default, $iEnd_Row = Default, $iStart_Col = Default, $iEnd_Col = Default, $iToCopyStart_Row = Default, $iToCopyEnd_Row = Default, $iToCopyStart_Col = Default, $iToCopyEnd_Col = Default)
; Parameters ....: $aArray            - [ByRef] array
;                  $aArrayToCopy            - [Const ByRef] array to copy
;                  $iStart_Row    - [Optional] Starting index/row in Array (default = 0)
;                  $iEnd_Row      - [Optional] Ending index/row in Array (default = last index)
;                  $iStart_Col    - [Optional] Starting column in 2D Array (default = 0)
;                  $iEnd_Col      - [Optional] Ending column in 2D Array (default = last column)
;                  $iToCopyStart_Row    - [Optional] Starting row in Array To Copy (default = 0)
;                  $iToCopyEnd_Row      - [Optional] Ending row in Array To Copy (default = last row)
;                  $iToCopyStart_Col    - [Optional] Starting column in 2D Array To Copy (default = 0)
;                  $iToCopyEnd_Col      - [Optional] Ending column in 2D Array To Copy (default = last column)
; Return values .: Success - Returns 1
;                  Failure - Returns 0 and sets @error:
;                  1-4 - Array type validation
;                  5-7 - 1D Array To Copy parameters
;                  8-13 - 2D Array To Copy parameters
;                  14-16 - 1D Array parameters
;                  17-22 - 2D Array parameters
; Author ........: WarMan
; Modified ......: 2025-02-03
; Remarks .......: - Handles 1D ↔ 1D, 1D ↔ 2D, and 2D ↔ 2D copying
;                  - Copies row-wise for 2D → 1D conversions
;                  - array MUST be pre-dimensioned
; Example 1 .....: Copy 1D to 1D
;                  Local $aArrayToCopy[5] = [1,2,3,4,5]
;                  Local $aArray[5]
;                  _ArrayCopyRange($aArray, $aArrayToCopy, 0, 4)
; Example 2 .....: Copy 2D section to 2D
;                  Local $aArrayToCopy[2][2] = [[1,2],[3,4]]
;                  Local $aArray[3][3]
;                  _ArrayCopyRange($aArray, $aArrayToCopy, 1,2, 1,2, 0,1, 0,1)
; Example 3 .....: Copy 1D to 2D grid
;                  Local $aArrayToCopy[4] = [1,2,3,4]
;                  Local $aArray[2][2]
;                  _ArrayCopyRange($aArray, $aArrayToCopy, 0,1, 0,1, 0,3)
; ==============================================================================

Func _ArrayCopyRange(ByRef $aArray, Const ByRef $aArrayToCopy, $iStart_Row = Default, $iEnd_Row = Default, $iStart_Col = Default, $iEnd_Col = Default, $iToCopyStart_Row = Default, $iToCopyEnd_Row = Default, $iToCopyStart_Col = Default, $iToCopyEnd_Col = Default)

    If Not IsArray($aArrayToCopy) Then Return SetError(1, 0, 0)
    If Not IsArray($aArray) Then Return SetError(2, 0, 0)

    Local $iToCopyDim = UBound($aArrayToCopy, $UBOUND_DIMENSIONS)
    Local $iDim = UBound($aArray, $UBOUND_DIMENSIONS)

    If $iToCopyDim < 1 Or $iToCopyDim > 2 Then Return SetError(3, 0, 0)
    If $iDim < 1 Or $iDim > 2 Then Return SetError(4, 0, 0)

    If $iStart_Row = Default Then $iStart_Row = 0
    If $iEnd_Row = Default Then $iEnd_Row = -1
    If $iStart_Col = Default Then $iStart_Col = 0
    If $iEnd_Col = Default Then $iEnd_Col = -1
    If $iToCopyStart_Row = Default Then $iToCopyStart_Row = 0
    If $iToCopyEnd_Row = Default Then $iToCopyEnd_Row = -1
    If $iToCopyStart_Col = Default Then $iToCopyStart_Col = 0
    If $iToCopyEnd_Col = Default Then $iToCopyEnd_Col = -1

    If $iToCopyDim = 1 Then
        If $iToCopyEnd_Row = -1 Then $iToCopyEnd_Row = UBound($aArrayToCopy, $UBOUND_ROWS) - 1
        If $iToCopyStart_Row < 0 Or $iToCopyStart_Row > UBound($aArrayToCopy, $UBOUND_ROWS) - 1 Then Return SetError(5, 0, 0)
        If $iToCopyEnd_Row < 0 Or $iToCopyEnd_Row > UBound($aArrayToCopy, $UBOUND_ROWS) - 1 Then Return SetError(6, 0, 0)
        If $iToCopyStart_Row > $iToCopyEnd_Row Then Return SetError(7, 0, 0)
    Else
        If $iToCopyEnd_Row = -1 Then $iToCopyEnd_Row = UBound($aArrayToCopy, $UBOUND_ROWS) - 1
        If $iToCopyEnd_Col = -1 Then $iToCopyEnd_Col = UBound($aArrayToCopy, $UBOUND_COLUMNS) - 1
        If $iToCopyStart_Row < 0 Or $iToCopyStart_Row > UBound($aArrayToCopy, $UBOUND_ROWS) - 1 Then Return SetError(8, 0, 0)
        If $iToCopyEnd_Row < 0 Or $iToCopyEnd_Row > UBound($aArrayToCopy, $UBOUND_ROWS) - 1 Then Return SetError(9, 0, 0)
        If $iToCopyStart_Row > $iToCopyEnd_Row Then Return SetError(10, 0, 0)
        If $iToCopyStart_Col < 0 Or $iToCopyStart_Col > UBound($aArrayToCopy, $UBOUND_COLUMNS) - 1 Then Return SetError(11, 0, 0)
        If $iToCopyEnd_Col < 0 Or $iToCopyEnd_Col > UBound($aArrayToCopy, $UBOUND_COLUMNS) - 1 Then Return SetError(12, 0, 0)
        If $iToCopyStart_Col > $iToCopyEnd_Col Then Return SetError(13, 0, 0)
    EndIf

    If $iDim = 1 Then
        If $iEnd_Row = -1 Then $iEnd_Row = UBound($aArray, $UBOUND_ROWS) - 1
        If $iStart_Row < 0 Or $iStart_Row > UBound($aArray, $UBOUND_ROWS) - 1 Then Return SetError(14, 0, 0)
        If $iEnd_Row < 0 Or $iEnd_Row > UBound($aArray, $UBOUND_ROWS) - 1 Then Return SetError(15, 0, 0)
        If $iStart_Row > $iEnd_Row Then Return SetError(16, 0, 0)
    Else
        If $iEnd_Row = -1 Then $iEnd_Row = UBound($aArray, $UBOUND_ROWS) - 1
        If $iEnd_Col = -1 Then $iEnd_Col = UBound($aArray, $UBOUND_COLUMNS) - 1
        If $iStart_Row < 0 Or $iStart_Row > UBound($aArray, $UBOUND_ROWS) - 1 Then Return SetError(17, 0, 0)
        If $iEnd_Row < 0 Or $iEnd_Row > UBound($aArray, $UBOUND_ROWS) - 1 Then Return SetError(18, 0, 0)
        If $iStart_Row > $iEnd_Row Then Return SetError(19, 0, 0)
        If $iStart_Col < 0 Or $iStart_Col > UBound($aArray, $UBOUND_COLUMNS) - 1 Then Return SetError(20, 0, 0)
        If $iEnd_Col < 0 Or $iEnd_Col > UBound($aArray, $UBOUND_COLUMNS) - 1 Then Return SetError(21, 0, 0)
        If $iStart_Col > $iEnd_Col Then Return SetError(22, 0, 0)
    EndIf

    Switch $iToCopyDim
        Case 1
            Switch $iDim
                Case 1
                    For $i = $iStart_Row To $iEnd_Row
                        If $iToCopyStart_Row > $iToCopyEnd_Row Then ExitLoop
                        $aArray[$i] = $aArrayToCopy[$iToCopyStart_Row]
                        $iToCopyStart_Row += 1
                    Next
                Case 2
                    For $iTargetRow = $iStart_Row To $iEnd_Row
                        For $iCol = $iStart_Col To $iEnd_Col
                            If $iToCopyStart_Row > $iToCopyEnd_Row Then ExitLoop 2
                            $aArray[$iTargetRow][$iCol] = $aArrayToCopy[$iToCopyStart_Row]
                            $iToCopyStart_Row += 1
                        Next
                    Next
            EndSwitch
        Case 2
            Switch $iDim
                Case 1
                    Local $iToCopyCol = $iToCopyStart_Col
                    For $i = $iStart_Row To $iEnd_Row
                        If $iToCopyCol > $iToCopyEnd_Col Then
                            If $iToCopyStart_Row > $iToCopyEnd_Row Then ExitLoop
                            $iToCopyStart_Row += 1
                            $iToCopyCol = $iToCopyStart_Col
                        EndIf
                        $aArray[$i] = $aArrayToCopy[$iToCopyStart_Row][$iToCopyCol]
                        $iToCopyCol += 1
                    Next
                Case 2
                    For $iTargetRow = $iStart_Row To $iEnd_Row
                        If $iToCopyStart_Row > $iToCopyEnd_Row Then ExitLoop
                        Local $iToCopyCol = $iToCopyStart_Col
                        For $iTargetCol = $iStart_Col To $iEnd_Col
                            If $iToCopyCol > $iToCopyEnd_Col Then ExitLoop
                            $aArray[$iTargetRow][$iTargetCol] = $aArrayToCopy[$iToCopyStart_Row][$iToCopyCol]
                            $iToCopyCol += 1
                        Next
                        $iToCopyStart_Row += 1
                    Next
            EndSwitch
    EndSwitch

    Return 1
EndFunc   ;==>_ArrayCopyRange

 

Edited by WarMan

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...