Jump to content
JohnLM

Creating irregularly shaped multi-dim dynamic arrays

Recommended Posts

Is it possible to set variable size multi-dimentional arrays dynamically at runtime?

Or, do I have to be clever about it in another way? 

 

My usual ways to create m-a's are the typical triangle shape, not irregularly shaped. I want to create the irregularly shaped, like the examples listed below. 

 

I have been playing around with run-time dynamic arrays via SetLength() and then realized I can't create them dynamically with different size Columns. I have been using for/next and repeat/until loops of various kinds to attempt to do the irregularly shapped arrays but when I come to create a new Row and reset the C to 1, the data is wiped or I get strange behavior, which leads me to realize this route is not possible, and that I have to do something really clever, maybe to simulate multi-dim dynamic arrays. 

 

I have a string list that I want to parse as values--text for strings, numbers for integers.

 

The multi-dim array can look something like the following examples below: 

 

where s=string, n=number, r=row, c=column

 

So, using ex 1, as I parse my string list, (a single column list), R is set to 1 for row 1, and C is set to 1, and as I parse through the list, I inc(C) for row 1, thus, ( 1 [n, n, n] ) 

 

When I create row 2, I inc(R), and is now row 2, thus ( 2 [n, n, n, n, n] ), . . ., and so on, for row 3, . . . etc. 
 

ex 1
====

R | C - - - >
-----------------
1 [n, n, n]
2 [n, n, n, n, n]
3 [n, n]
4 [n, n, n, n]
5 [n]

ex 2
====

R | C - - - >
-----------------------------------------
1 [n, n, n, n, n, n, n, n, n, n, n, n, n]
2 [s, s, s]
3 [n, n]
4 [s, s, s, s, s, s, s, s]

ex 3
====

R | C - - - >
--------------------------------------------------------------
1 [s, s]
2 [s]
3 [s, s, s, s, s]
4 [s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s]
5 [s, s, s]
6 [n, n, n, n, n, n, n]

 

Edited by JohnLM
typo

Share this post


Link to post

note, I am not asking for someone to write the code for me.  If it is possible, then I am asking for pointer(s) to which function does this.  I will write the code mentioned for the 3 examples listed in my initial post above. 

Share this post


Link to post

in a dynamic 2D array ( a type like TMyArray = array of array of integer) you can set the number of rows with a SetLength call on the array variable and, for each row, set the number of columns with a SetLength(arrayvar, rowindex) call. That should cover your requirements. To reduce memory fragmentation you should avoid multiple SetLength calls on the same array row or the array itself, though. Determine the number of rows/elements beforehand, if possible.

  • Thanks 1

Share this post


Link to post
Just now, PeterBelow said:

for each row, set the number of columns with a SetLength(arrayvar, rowindex) call.

This doesn't seem right. The call should be SetLength(arrayvar[rowindex], columnsize), shouldn't it?

Share this post


Link to post
Just now, Uwe Raabe said:

This doesn't seem right. The call should be SetLength(arrayvar[rowindex], columnsize), shouldn't it?

Yes, my bad. I'm getting old ... 🙂

Share this post


Link to post

I don't know why I am having so much trouble with something that seems too easy to accomplish, yet I am.  I just got up and saw these posts, and decided to sketch out an illustration of what I am trying to accomplish.  Please forgive me if I seem too slow at all this.  I am a very slow person these days in my old age. 

 

Okay.  I have simplified this in an Excel sheet to help illustrate the basic process. 

* in the finished product, the "irregularly" shaped array should look like what's shown in blue in fig 4. 

 

1824315769_im-praxis-1-creating-irregularly-shaped-multi-dim-dynamic-arrays.thumb.png.9dc5259753f9da408601c6350b4c1ccb.png

 

 

I believe the main part of my problem is that I am doing this setlength() inside the parser routine and that I have to build the irregularly shaped array afterwards once I have the (R,C) criteria in fig 4. 

 

Also, I found this link that may help: https://docwiki.embarcadero.com/RADStudio/Athens/en/Structured_Types_(Delphi)#Multidimensional_Dynamic_Arrays

 

PS:  I've just updated the grid in fig 4 to show that they are individual elements in the array, not one string. 

Edited by JohnLM
uploaded new image

Share this post


Link to post
9 hours ago, PeterBelow said:

Determine the number of rows/elements beforehand, if possible.

 

@PeterBelow -- that is my idea too. I just realized now, that you had said this earlier--I missed that part.   But yes, I believe that is what I have to do, thanks.

Share this post


Link to post

Update. . .

 

Okay, I have finally figured it out.  Am running to work but may post an update with a solution or explanation later. . .

Share this post


Link to post

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

×