Jump to content

Recommended Posts

Posted (edited)

I am trying to get column 0 from A 2D array.

In the below example,  (adapted from Autoit Example Script for _ArrayExtract)

The first ArrayExtract works as expected and returns only column 1 | Start Column  = 1 End column = 1

The Second ArrayExtract returns data from all columns. | Start Column  = 0 End column = 0

The Third ArrayExtract works as expected and returns only Row 1 . | Start Row = 1 End Row = 1

The Fourth ArrayExtract returns data from all Rows. | Start Row = 0 End Row = 0

If start = 1 end = 1 returns column 1 And/ row 1  respectively why does start = 0 end = 0 return all rows/columns.

What is the correct variables to use to extract only row 0 OR column 0?

Thank You,

Shane

Edit: Added work around function for anyone who needs it, description near bottom of post.

#include <Array.au3>

Local $aArray[4][4]
For $i = 0 To 3
    For $j = 0 To 3
        $aArray[$i][$j] = $i & $j
    Next
Next
_ArrayDisplay($aArray, "Original")

Local $aExtract = _ArrayExtract($aArray, 0, 3, 1, 1) ; works as expected
_ArrayDisplay($aExtract, "Row 0-3 column 1")

Local $aExtract = _ArrayExtract($aArray, 0, 3, 0, 0) ; irregular results
_ArrayDisplay($aExtract, "Row 0-3 column 0")

Local $aExtract = _ArrayExtract($aArray, 1, 1, 1, 3); works as expected
_ArrayDisplay($aExtract, "Row 1 column 1 - 3")

Local $aExtract = _ArrayExtract($aArray, 0, 0, 1, 3) ; irregular results
_ArrayDisplay($aExtract, "Row 0 column 1 - 3")
 
 

 

ArrayExtract.au3

Edited by Shane0000
Posted (edited)

Shane0000,

This is how I would do it...

#include <Array.au3>

Local $aArray[4][4]
For $i = 0 To 3
    For $j = 0 To 3
        $aArray[$i][$j] = $i & $j
    Next
Next
_ArrayDisplay($aArray, "Original")

; if you want the value at the offset
ConsoleWrite('value at row0/column0 = ' & $aArray[0][0] & @CRLF)

; if you want all of column 0
for $1 = 0 to ubound($aArray) - 1
    ConsoleWrite($aArray[$1][0] & @CRLF)
next

I could not get _arrayextract to work after a cursory attempt.  The doc for this function appars to be cloned from _arraydelete as $vrange is referenced in the REMARKS but does not appear in the function prototype or parameter definitions and appears to be in error.  I believe that most array UDF's reserve row 0 col 0 for a count (don't really know as I rarely use them except _arraydisplay).

kylomas

Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Posted (edited)

Yeah writing code to do it would work but it seems like the function should work.

IMO a -1 would be better variable for all data as not all arrays are created with an array count in column 0.

Anywho what If I wanted all the array counts for that matter? 0,0 still would give erroneous results.

Also you cannot get row 0 from this function :/

Thanks for your input.

Edited by Shane0000
Posted
Anywho what If I wanted all the array counts for that matter? 0,0 still would give erroneous results.

 

What does this mean?  There is only 1 array.

Also you cannot get row 0 from this function :/

 

I could not get it either...

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Posted

i was referring to your post about 0/0 holding a count. usually a created array does have the count in column 0. , a n array from  _Array Concatenate may have all counts in column 0 but thats off topic

 

My array is from a defined array that values gets data assigned to it so row 0 and column 0 hold data that I would like to quickly and easily access as this Function describes its self to do :

'Extracts an array from the specified element(s) of a 1D or 2D array'  

 I simply would like the ability to specify column 0 or Row 0

Posted (edited)

I agree with you.  I am trying to figure out how/if a trac ticket should be opened, at least for doc clarification/correction.

edit: One thing you might consider.  It is simple code, create your own function/UDF.

edit2: spelling...this KB is SHIT

Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Posted (edited)

Here is my workaround:

This will extract data from 1d and 2d arrays and will give you access to row 0 and column 0

This works with the same syntax of _ArrayExtract

ArrayExtract(Source array, Start Row, End Row, (optional) Start Column, (optional) End Column)

Example Script attached

Func ArrayExtract(ByRef $aArray,$iRstart, $iRend, $iCstart = 0, $iCend = 0)
    If Not IsArray($aArray) Then
        ConsoleWrite(-'Err 1 : Object is not an array' & @CRLF )
        SetError(-1)
        Return -1
    EndIf
    Local $iRows        = Ubound($aArray,1) - 1
    Local $iColumns = Ubound($aArray,2) - 1
    If $iColumns = -1 then
        $iColumns = 0
    EndIf
    If $iRstart > $iRows  OR  $iRstart < 0 Then
        ConsoleWrite('Err 2 : Requested Start Row out of bounds. (Total Rows: ' & $iRows & ' Requested Start Row: ' & $iRstart & ' )' & @CRLF )
        SetError(-2)
        Return -1
    EndIf
    If $iRend > $iRows Or $iRend < $iRstart Then
        ConsoleWrite('Err 3 : Requested End Row out of bounds. (Total Rows: ' & $iRows & ' Requested End Row: ' & $iRend & ' )' & @CRLF )
        SetError(-3)
        Return -1
    EndIf
    If $iCstart > $iColumns OR $iCstart < 0 Then
        ConsoleWrite('Err 4 : Requested Start Row out of bounds. (Total Columns: ' & $iColumns & ' Requested Start Column: ' & $iCstart & ' )' & @CRLF )
        SetError(-4)
        Return -1
    EndIf
    If $iCend > $iColumns OR $iCend < $iCstart Then
        ConsoleWrite('Err 5 : Requested End Row out of bounds. (Total Columns: ' & $iColumns & ' Requested End Column: ' & $iCend & ' )' & @CRLF )
        SetError(-5)
        Return -1
    EndIf
    Select
        Case $iColumns > 1 ; Requesting data from more than 1 Column in a 2D array
            Local $aResult[$iRend - $iRstart + 1][$iCend - $iCstart + 1]
            For $i = $iRstart to $iRend
                For $ii = $iCstart to $iCend
                    $aResult[$i - $iRstart][$ii - $iCstart] = $aArray[$i][$ii]
                Next
            Next
        Case $iColumns = 1 ; Requesting data from 1 Column in a 2D array
            Local $aResult[$iRend - $iRstart + 1]
            For $i = $iRstart to $iRend
                $aResult[$i - $iRstart] = $aArray[$i][$iCstart]
            Next
        Case $iColumns = 0 ; Requesting Data from a 1D array
            Local $aResult[$iRend - $iRstart + 1]
            For $i = $iRstart to $iRend
                $aResult[$i - $iRstart] = $aArray[$i]
            Next
        Case Else
            ConsoleWrite('-Err 6 : Unknown Error' & @CRLF )
            SetError(-6)
            Return -1
    EndSelect
    Return $aResult
EndFunc

ArrayExtract.au3

Edited by Shane0000
  • Moderators
  • Solution
Posted

Shane0000,

I believe I have fixed the bug and now I need to test a bit more. If you (or anyone else) would care to test as well, here is the new function: :)

#include <Array.au3>

Local $aArray[4][4]
For $i = 0 To 3
    For $j = 0 To 3
        $aArray[$i][$j] = $i & $j
    Next
Next
_ArrayDisplay($aArray, "Original")

Local $aExtract = _ArrayExtract_Mod($aArray, 0, 3, 1, 1)
_ArrayDisplay($aExtract, "Row 0-3 column 1")

Local $aExtract = _ArrayExtract_Mod($aArray, 0, 3, 0, 0)
_ArrayDisplay($aExtract, "Row 0-3 column 0")

Local $aExtract = _ArrayExtract_Mod($aArray, 1, 1, 1, 3)
_ArrayDisplay($aExtract, "Row 1 column 1 - 3")

Local $aExtract = _ArrayExtract_Mod($aArray, 0, 0, 1, 3)
_ArrayDisplay($aExtract, "Row 0 column 1 - 3")

Func _ArrayExtract_Mod(Const ByRef $avArray, $iStart_Row = -1, $iEnd_Row = -1, $iStart_Col = -1, $iEnd_Col = -1)

    If $iStart_Row = Default Then $iStart_Row = -1
    If $iEnd_Row = Default Then $iEnd_Row = -1
    If $iStart_Col = Default Then $iStart_Col = -1
    If $iEnd_Col = Default Then $iEnd_Col = -1
    If Not IsArray($avArray) Then Return SetError(1, 0, -1)
    Local $iDim_1 = UBound($avArray, $UBOUND_ROWS) - 1
    If $iEnd_Row = -1 Then $iEnd_Row = $iDim_1
    If $iStart_Row = -1 Then $iStart_Row = 0
    If $iStart_Row < 0 Or $iEnd_Row < 0 Then Return SetError(3, 0, -1)
    If $iStart_Row > $iDim_1 Or $iEnd_Row > $iDim_1 Then Return SetError(3, 0, -1)
    If $iStart_Row > $iEnd_Row Then Return SetError(4, 0, -1)
    Switch UBound($avArray, $UBOUND_DIMENSIONS)
        Case 1
            Local $aRetArray[$iEnd_Row - $iStart_Row + 1]
            For $i = 0 To $iEnd_Row - $iStart_Row
                $aRetArray[$i] = $avArray[$i + $iStart_Row]
            Next
            Return $aRetArray
        Case 2
            Local $iDim_2 = UBound($avArray, $UBOUND_COLUMNS) - 1
            If $iEnd_Col = -1 Then $iEnd_Col = $iDim_2
            If $iStart_Col = -1 Then $iStart_Col = 0
            If $iStart_Col < 0 Or $iEnd_Col < 0 Then Return SetError(5, 0, -1)
            If $iStart_Col > $iDim_2 Or $iEnd_Col > $iDim_2 Then Return SetError(5, 0, -1)
            If $iStart_Col > $iEnd_Col Then Return SetError(6, 0, -1)
            If $iStart_Col = $iEnd_Col Then
                Local $aRetArray[$iEnd_Row - $iStart_Row + 1]
            Else
                Local $aRetArray[$iEnd_Row - $iStart_Row + 1][$iEnd_Col - $iStart_Col + 1]
            EndIf
            For $i = 0 To $iEnd_Row - $iStart_Row
                For $j = 0 To $iEnd_Col - $iStart_Col
                    If $iStart_Col = $iEnd_Col Then
                        $aRetArray[$i] = $avArray[$i + $iStart_Row][$j + $iStart_Col]
                    Else
                        $aRetArray[$i][$j] = $avArray[$i + $iStart_Row][$j + $iStart_Col]
                    EndIf
                Next
            Next
            Return $aRetArray
        Case Else
            Return SetError(2, 0, -1)
    EndSwitch

    Return 1

EndFunc   ;==>_ArrayExtract_Mod
M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

  • Moderators
Posted

Shane0000,

Changes to the code and the Help file committed for the next Beta. Thanks for the report. :)

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

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...