Sign in to follow this  
Followers 0
Guy_

2D array | vertical wrap around | _ArrayExtract won't get 1st row?

8 posts in this topic

#1 ·  Posted (edited)

If I wanna be able to "vertically rotate" (scroll up and down) 2D array rows, like...

row 0
row 1
row 2

to

row 2
row 0
row 1

etc. (both directions, where the one that disappears goes to the other end) ...

1) Do I have to make my own function, or is there a simple trick I am missing?

2) If I have to make my own function, would it be more or less like this one I made up?
 

Problem here is that only "UP" is working...

* I may be missing something very simple...? :-)

* Why can't I seem to get the first row with _ArrayExtract($_aArray, 0, 0) somehow anyway...?

#include <Array.au3>

HotKeySet("{PGUP}", "_ArrayUp")
HotKeySet("{PGDN}", "_ArrayDown")

Global $aArray[3][2] = [["0 ", " car"],["1 ", " bike"],["2 ", " boat"]]

ToolTip(_ArrayToString($aArray), 0,0)

While 1
    Sleep(100)
WEnd


Func _2D_ArrayScroll_vert ( $_aArray, $direction = 0 )

    Local $aSplit_1, $aSplit_2

    If $direction = 0 Then    ; scroll DOWN
        ; get all rows except last
        $aSplit_1 = _ArrayExtract($_aArray, 0, UBound($_aArray) - 2 )
;~             MsgBox(0,"", _ArrayToString($aSplit_1))
        ; get last row only
        $aSplit_2 = _ArrayExtract($_aArray, UBound($_aArray) - 1, UBound($_aArray) - 1 )
;~             MsgBox(0,"", _ArrayToString($aSplit_2))
        ; $aSplit_2 = 'last row' + 'all rows except last'
        _ArrayAdd($aSplit_2, $aSplit_1)
        $_aArray = $aSplit_2
    Else                    ; scroll UP
        $aSplit_1 = _ArrayExtract($_aArray, 1, UBound($_aArray) - 1 )
            MsgBox(0,"", _ArrayToString($aSplit_1))
; PROBLEM AREA: how to get 1st row of $_aArray into $aSplit_2 ?
;~      $aSplit_2 = $_aArray[0][2]  ; doesn't work  [1][2] neither
        $aSplit_2 = _ArrayExtract($_aArray, 0, 0)  ; doesn't work, other variations get the wrong row, or too many rows
            MsgBox(0,"", _ArrayToString($aSplit_2))
        _ArrayAdd ($aSplit_1, $aSplit_2)
        $_aArray = $aSplit_1
    EndIf

    $aArray = $_aArray

    ToolTip(_ArrayToString($aArray), 0,0)

EndFunc


Func _ArrayDown()
    _2D_ArrayScroll_vert ( $aArray )
EndFunc


Func _ArrayUp()
    _2D_ArrayScroll_vert ( $aArray, -1 )
EndFunc


#cs
; DOWN
0 car
1 bike
2 boat

2 boat
0 car
1 bike

; UP
0 car
1 bike
2 boat

1 bike
2 boat
0 car
#ce

Thanks!  :)

Edited by Guy_

Share this post


Link to post
Share on other sites



You can check out this here whether it is what you are looking for: 

Br,

UEZ


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

You can check out this here whether it is what you are looking for: 

 

Thanks, but that looks very freaky! ;)  (at 1st sight not too related or too complicated to get into after losing the wole morning already...)

I'm hoping for a simple fix in my code, *or* a simpler way, *and* to know why _ArrayExtract doesn't work for row 0 there...?

Edited by Guy_

Share this post


Link to post
Share on other sites

Guy_,

There was a bug in __ArrayExtract - it has been fixed in the Beta release since July. You can get the latest Beta here. ;)

I would do what you want like this: :)

#include <Array.au3>

HotKeySet("{PGUP}", "_ArrayUp")
HotKeySet("{PGDN}", "_ArrayDown")
HotKeySet("{ESC}", "_Exit")

Global $aArray[3][2] = [["0 ", " A"], ["1 ", " B"], ["2 ", " C"]]

ToolTip(_ArrayToString($aArray), 0, 0)

While 1
    Sleep(10)
WEnd

Func _ArrayUp()
    $aTmp = _ArrayExtract($aArray, 1, Default)        ; Extract all but top row
    _ArrayAdd($aTmp,  _ArrayExtract($aArray, 0, 0))   ; Add top row at bottom
    $aArray = $aTmp
    ToolTip(_ArrayToString($aArray), 0, 0)
EndFunc

Func _ArrayDown()
    $iUBound = UBound($aArray)                                             ; Get size of array
    $aTmp = _ArrayExtract($aArray, 0, $iUBound - 2)                        ; Extract all but last
    _ArrayInsert($aTmp, 0, _ArrayExtract($aArray, $iUBound - 1, Default))  ; Insert last at top
    $aArray = $aTmp
    ToolTip(_ArrayToString($aArray), 0, 0)
EndFunc

Func _Exit()
    Exit
EndFunc
Please ask if you have any questions. :)

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______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

 

Share this post


Link to post
Share on other sites

The manual way:

#include <Array.au3>

HotKeySet("{PGUP}", "_ArrayUp")
HotKeySet("{PGDN}", "_ArrayDown")
HotKeySet("{ESC}", "_Exit")

Global $aArray[3][2] = [["0 ", " car"],["1 ", " bike"],["2 ", " boat"]]

ToolTip(_ArrayToString($aArray), 0,0)

While 1
    Sleep(100)
WEnd


Func _2D_ArrayScroll_vert ( ByRef $_aArray, $direction = 0 )

    Local $iX, $iY, $iW = UBound($_aArray, 2) - 1, $iH = UBound($_aArray) - 1, $aTmp[$iW + 1]

    If $direction = 0 Then    ; scroll DOWN
        For $iX = 0 To $iW
            $aTmp[$iX] = $_aArray[$iH][$iX]
        Next
        For $iY = $iH To 1 Step - 1
            For $iX = 0 To $iW
                $_aArray[$iY][$iX] = $_aArray[$iY - 1][$iX]
            Next
        Next
        For $iX = 0 To $iW
            $_aArray[0][$iX] = $aTmp[$iX]
        Next
    Else                    ; scroll UP
        For $iX = 0 To $iW
            $aTmp[$iX] = $_aArray[0][$iX]
        Next
        For $iY = 1 To $iH
            For $iX = 0 To $iW
                $_aArray[$iY - 1][$iX] = $_aArray[$iY][$iX]
            Next
        Next
        For $iX = 0 To $iW
            $_aArray[$iH][$iX] = $aTmp[$iX]
        Next
    EndIf

    ToolTip(_ArrayToString($aArray), 0,0)

EndFunc


Func _ArrayDown()
    _2D_ArrayScroll_vert ( $aArray )
EndFunc


Func _ArrayUp()
    _2D_ArrayScroll_vert ( $aArray, -1 )
EndFunc


Func _Exit()
    Exit
EndFunc

#cs
; DOWN
0 car
1 bike
2 boat

2 boat
0 car
1 bike

; UP
0 car
1 bike
2 boat

1 bike
2 boat
0 car
#ce

Br,

UEZ


Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯

Share this post


Link to post
Share on other sites

There was a bug in __ArrayExtract. ;)

 

Neat. And yep, that fixed it and made both our versions work. Thanks!

I'm now more confident that I should report what I think is a bug and I'm looking for the bug section already :)

The manual way:

 

You freak me out!  :P

I'm guessing this is code so you don't need the UDF version?

Interesting to see (for code junkies ;) )

Share this post


Link to post
Share on other sites

Guy_,

Good. :)

 

I'm now more confident that I should report what I think is a bug

If there is any doubt as to whether it is a bug, could I suggest posting in the forum first to see if others agree. Then if confirmed you can open a Trac ticket - use the BugTracker link in the menu bar above the forum. ;)

M23


Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______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

 

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

Oops, I just posted it here:

And thanks again  :)

Edited by Guy_

Share this post


Link to post
Share on other sites

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
Sign in to follow this  
Followers 0

  • Similar Content

    • l3ill
      By l3ill
      Hi Gents,
      Updating one of my older scripts here and cant get around this wall...
      I want to extract chunks from an larger array of indefinite size as smaller arrays in a loop and work with them individually and then move on to the the next "extracted array" until the original array is empty.
      The amount of elements in each extracted array will usually be different so I am using _ArraySearch to find my start and stop points and storing them as variables, which brings me to my problem.
      I want to "remove" (delete) the extracted array from the original array each time using _ArrayDelete but it doesnt seem to want me to use variables.
      Here is a reproducer:
      #include <Array.au3> Local $aArray[10] For $i = 0 To 9 $aArray[$i] = $i Next _ArrayDisplay($aArray, "Original") $i_Start = 0 $i_End = 5 Local $aExtract = _ArrayExtract($aArray, $i_Start, $i_End) _ArrayDisplay($aExtract, "Extracted Array") Local $vRange = $i_Start - $i_End _ArrayDelete($aArray, $vRange) ;==error 3 - $vRange is not a valid range string If @error Then MsgBox(0, "error =", @error) EndIf _ArrayDisplay($aArray, "After Deletion") Any suggestions would be appreciated :-)
      cya,
      Bill
       
      edit:  the error I am getting is    3 - $vRange is not a valid range string
      edit 2: BTW this doesn't work either _ArrayDelete($aArray, $i_Start - $i_End)
    • Shane0000
      By Shane0000
      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
    • Shane0000
      By Shane0000
      Would one of the devs or the akin look at the post below regarding ArrayExtracts inability to extract row 0 and also column 0.
      I am unsure of how where to open a ticket. 
      If I should do this instead can some one provide a link to the ticket page.
      Thank you,
      Shane
      '?do=embed' frameborder='0' data-embedContent>>