Forum - MCS Electronics

Author Message
Pikczu

Joined: 22 Jan 2006
Posts: 53
Location: Dublin, Ireland

Posted: Sun Apr 14, 2019 6:21 pm    Post subject: Multi dimensional array question

HI all,
I'm trying to use multi dimensional arrays, and i don't understand behavior of it:
 Quote: Lets see how memory is organized when using multiple indexes. For the sample we use an array of 5x3 bytes. Dim ar(5,3) as byte. This gives us the following possible index values : 1,1 1,2 1,3 2,1 2,2 2,3 3,1 3,2 3,3 4,1 4,2 4,3 5,1 5,2 5,3 Since the memory of the processor is linear, we have 15 cells.

So this is clear for me.
But when I run the test simulator show something different , look at table 2 attached.

However when I run memcopy on the same array addresses are increased linear.

You can see it in the table 3.

Can some one explain this please ?

Test code run it in the simulator.
 Code: \$regfile = "m8def.dat" \$crystal = 16000000 \$hwstack=40 \$swstack=16 \$framesize = 32 Dim Multi_array(16 , 6) As Byte                             'destination array dim A as byte 'used for for next to fill up array dim byte_count as byte   'used for memcopy to store amount of copied bytes Dim index as byte 'index for array idex dim source_array(6) as byte 'source array 'test1 Multi_array(1 , 1) = 1 Multi_array(1 , 2) = 1 Multi_array(1 , 3) = 1 Multi_array(1 , 4) = 1 Multi_array(1 , 5) = 1 Multi_array(1 , 6) = 1 Multi_array(2 , 1) = 2 Multi_array(2 , 2) = 2 Multi_array(2 , 3) = 2 Multi_array(2 , 4) = 2 Multi_array(2 , 5) = 2 Multi_array(2 , 6) = 2 Multi_array(3 , 1) = 3 Multi_array(3 , 2) = 3 Multi_array(3 , 3) = 3 Multi_array(3 , 4) = 3 Multi_array(3 , 5) = 3 Multi_array(3 , 6) = 3 Multi_array(4 , 1) = 4 Multi_array(4 , 2) = 4 Multi_array(4 , 3) = 4 Multi_array(4 , 4) = 4 Multi_array(4 , 5) = 4 Multi_array(4 , 6) = 4 Multi_array(5 , 1) = 5 Multi_array(5 , 2) = 5 Multi_array(5 , 3) = 5 Multi_array(5 , 4) = 5 Multi_array(5 , 5) = 5 Multi_array(5 , 6) = 5 Multi_array(6 , 1) = 6 Multi_array(6 , 2) = 6 Multi_array(6 , 3) = 6 Multi_array(6 , 4) = 6 Multi_array(6 , 5) = 6 Multi_array(6 , 6) = 6 Multi_array(7 , 1) = 7 Multi_array(7 , 2) = 7 Multi_array(7 , 3) = 7 Multi_array(7 , 4) = 7 Multi_array(7 , 5) = 7 Multi_array(7 , 6) = 7 Multi_array(8 , 1) = 8 Multi_array(8 , 2) = 8 Multi_array(8 , 3) = 8 Multi_array(8 , 4) = 8 Multi_array(8 , 5) = 8 Multi_array(8 , 6) = 8 Multi_array(9 , 1) = 9 Multi_array(9 , 2) = 9 Multi_array(9 , 3) = 9 Multi_array(9 , 4) = 9 Multi_array(9 , 5) = 9 Multi_array(9 , 6) = 9 Multi_array(10 , 1) = 10 Multi_array(10 , 2) = 10 Multi_array(10 , 3) = 10 Multi_array(10 , 4) = 10 Multi_array(10 , 5) = 10 Multi_array(10 , 6) = 10 Multi_array(11 , 1) = 11 Multi_array(11 , 2) = 11 Multi_array(11 , 3) = 11 Multi_array(11 , 4) = 11 Multi_array(11 , 5) = 11 Multi_array(11 , 6) = 11 Multi_array(12 , 1) = 12 Multi_array(12 , 2) = 12 Multi_array(12 , 3) = 12 Multi_array(12 , 4) = 12 Multi_array(12 , 5) = 12 Multi_array(12 , 6) = 12 Multi_array(13 , 1) = 13 Multi_array(13 , 2) = 13 Multi_array(13 , 3) = 13 Multi_array(13 , 4) = 13 Multi_array(13 , 5) = 13 Multi_array(13 , 6) = 13 Multi_array(14 , 1) = 14 Multi_array(14 , 2) = 14 Multi_array(14 , 3) = 14 Multi_array(14 , 4) = 14 Multi_array(14 , 5) = 14 Multi_array(14 , 6) = 14 Multi_array(15 , 1) = 15 Multi_array(15 , 2) = 15 Multi_array(15 , 3) = 15 Multi_array(15 , 4) = 15 Multi_array(15 , 5) = 15 Multi_array(15 , 6) = 15 Multi_array(16 , 1) = 16 Multi_array(16 , 2) = 16 Multi_array(16 , 3) = 16 Multi_array(16 , 4) = 16 Multi_array(16 , 5) = 16 Multi_array(16 , 6) = 16 'test part 2 A= 17 for index = 1 to 6 source_array(index) =A next index index =1 'set index to one for memcopy byte_count = Memcopy(source_array(1) , Multi_array(index , 1 ) , 6 , 3) Do Loop End

Regards
Pikczu

(BASCOM-AVR version : 2.0.8.1 )

Last edited by Pikczu on Sun Apr 14, 2019 7:15 pm; edited 1 time in total
EDC

Joined: 26 Mar 2014
Posts: 580

Posted: Sun Apr 14, 2019 6:54 pm    Post subject:

Maybe this is the problem in data interpretation:
 Quote: Multiple indexes is a new feature in 2078. The simulator does not support this option yet, so for the simulator, only 1 array exists.

Pikczu

Joined: 22 Jan 2006
Posts: 53
Location: Dublin, Ireland

 Posted: Sun Apr 14, 2019 7:11 pm    Post subject: Well i'm confused. That's why I have asked here. I will edit attachments.

Joined: 13 Nov 2011
Posts: 165
Location: Moscow

 Posted: Mon Apr 15, 2019 10:51 am    Post subject: Hi, Correct me if I'm wrong... As I recall, Bascom does not support two-dimensional arrays. Or has this changed since version 2078?
EDC

Joined: 26 Mar 2014
Posts: 580

MWS

Joined: 22 Aug 2009
Posts: 1655

Posted: Mon Apr 15, 2019 9:24 pm    Post subject: Re: Multi dimensional array question

 Pikczu wrote: So this is clear for me.

I wouldn't say so. Your yellow/blue/white table is wrong.

Assume A is an leftmost, B the middle, and C the rightmost index.
Increase A by one and in linear view the cell immediately coming next is addressed.
Increase B by one and in linear view the cell indexed by B multiplied A-size with B is addressed. A.s.o.
In your table A and B is interchanged.

Try out the following code and watch within simulator the indexes address the cell within the linear array.
Notice I did use Base= 0, otherwise the calculations would have been slightly more complex.
 Code: \$Regfile="m328pdef.dat" \$Crystal=16000000 \$hwstack=40 \$swstack=16 \$framesize=32 Config Base = 0 Const A_size = 7 Const B_size = 4 Const C_size = 6 Const A_width = 1 Const B_width = A_size Const C_width = A_size * B_size Const arr_size = A_size * B_size * C_size Dim mult_arr(A_size, B_size, C_size) As Byte Dim linarr(arr_size) As Byte At mult_arr Overlay Dim A As Byte, A_ptr As Byte Dim B As Byte, B_ptr As Byte Dim C As Byte, C_ptr As Byte Dim linptr As Byte A = 3 : B = 2 : C = 4   mult_arr(A,B,C) = 29 A_ptr = A B_ptr = B * B_width C_ptr = C * C_width linptr = A_ptr + B_ptr : linptr = linptr + C_ptr   Print linarr(linptr) A = 3 : B = 0 : C = 5   mult_arr(A,B,C) = 36 A_ptr = A B_ptr = B * B_width C_ptr = C * C_width linptr = A_ptr + B_ptr : linptr = linptr + C_ptr   Print linarr(linptr) A = 1 : B = 1 : C = 1   mult_arr(A,B,C) = 96 A_ptr = A B_ptr = B * B_width C_ptr = C * C_width linptr = A_ptr + B_ptr : linptr = linptr + C_ptr   Print linarr(linptr) end
Pikczu

Joined: 22 Jan 2006
Posts: 53
Location: Dublin, Ireland

 Posted: Tue Apr 16, 2019 5:55 pm    Post subject: MWS thank you very much for your example. I will analyze it step by step. PS.Table pasted by me came from bascom help
MWS

Joined: 22 Aug 2009
Posts: 1655

Posted: Tue Apr 16, 2019 6:55 pm    Post subject:

 Pikczu wrote: Table pasted by me came from bascom help

Early version
Pikczu

Joined: 22 Jan 2006
Posts: 53
Location: Dublin, Ireland

 Posted: Sat Apr 20, 2019 4:01 pm    Post subject: MWS I have analyzed your example, thank you very much once more for your help. Now it is very clear for me. I have created excel spread sheet to visualize memory layout of the arrays. If someone else have "wrong understanding" of the multidimensional arrays this should help. Also varprt() is very helpful. Standard single dimension array: Two dimensional array: three indexes array:
 Display posts from previous: All Posts1 Day7 Days2 Weeks1 Month3 Months6 Months1 Year Oldest FirstNewest First
 All times are GMT + 1 Hour Page 1 of 1

 Jump to: Select a forum BASCOM AVR/8051----------------BASCOM-AVRBASCOM-8051BASCOM-ARDUINOShare your working BASCOM-8051 code hereShare your working BASCOM-AVR code hereBASCOM BETA-SLA BASCOM Related----------------EASY TCP/IPAVR-DOSAR7212KokkeKat FAT-free SD card libBASCOM Project Blog Other Stuff----------------VariousPCB'sRoboticsNew WebSiteAnnouncementsAVR Archive----------------BASCOM-AVR ArchiveBASCOM-8051 ArchiveBASCOM-AVR Unsupported versionsEasy TCP/IP ArchiveBASCOM-EDB
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum