Search the Community
Showing results for tags '_arraycopyrange'.
-
; #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