` Declaring an array at runtime (John Welsh ) - Icetips Article
Icetips - Templates, Tools & Utilities for Clarion Developers

Templates, Tools and Utilities
for Clarion Developers

Icetips Article

Back to article list   Search Articles     Add Comment     Printer friendly     Direct link  

Par2: Declaring an array at runtime
2000-02-14 -- John Welsh
 
I wanted to share this code with everyone. I worked out a way to declare multi-dimensional arrays art runtime. I believe they could be REDIM'd in a round about way. The code below works. Just create a .prj and turn of range checking. You will see I took several people's ideas and put them together with my own. Thanks to all who helped. The idea here is to set up a 1 dimensional dynamic array that can be accessed as if it is a multi-dimensinal array by calculating a pointer into the one DIM array. The array could be REDIM'd by creating a NEW instance of the curent one, copying the contents, DISPOSE of the first array, create it again using new DIM's and then copy the saved array back into the just created one. Finally, DISPOSE of the saved copy of the array. Now you will have a new array of a different size. The code for the copy back might be a bit tricky, but doable. !****************************************************** tstarray program map testa end Test CLASS,TYPE a SREAL,DIM(2) !Will let compiler know this is an array END x LONG !(x(y) + 1) Size(SREAL) --> will determine size of array y LONG ! x1 LONG !Subscript values y1 LONG ! code testa testa procedure t & Test s & STRING xy LONG ViewIt & CSTRING code !for t.a,DIM(x,y) where x = 10, and y = 5 ! (normal) (dynamic) ! t.a[x1,y1] is equivalent to --> t.a[(x1 - 1) * y + y1] This is how the subscripts translate from ! a normal Clarion array to a dynamic one x = 10 y = 5 xy = (x * y) * 4 + 4 !4 bytes for an SREAL + 4 to account for not using the 0 position ViewIt &= NEW(CSTRING(xy + 100)) ViewIt = '2 DIM array results|' s &= NEW(STRING(xy)) t &= ADDRESS(s) LOOP x1 = 1 TO x LOOP y1 = 1 TO y t.a[(x1 - 1) * y + y1] = y1 + (100 * x1) ViewIt = ViewIt & FORMAT(t.a[(x1 - 1) * y + y1],@n_5) END ! loop ViewIt = ViewIt & '|' END ViewIt = ViewIt & 'End' Message(ViewIt) DISPOSE(t) DISPOSE(ViewIt)


Today is April 26, 2024, 2:15 am
This article has been viewed 35127 times.



Back to article list   Search Articles   Add Comment   Printer friendly

Login

User Name:

Password: