× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



Hi Bryce,

On 10/8/2010 12:15 PM, Bryce Martin wrote:
I know that there is a way to get past the 32767 DIM limit and rely
totally on the 16MB space limitation.

Ohhhhh... _that_ is what you're looking for. (I read the whole thread, and you said you didn't want an array, you just wanted to grow your data structure... and I kept thinking you wanted to add subfields that aren't repeating like an array...)

You actually _do_ want an array (or perhaps a MODS) but you don't want RPG to implement the occurrences... _you_ want to implement the occurrences yourself so that you don't have the 32767 limit.

For me, it's easiest if I think abotu what an array (or MODS) really are... I mean, how does the computer view them? I mean, variables don't really exist -- they're just to make it easier for people. Likewise, array indexes, don't really exist... they're just to make things easier for people.

An array is a thing where the same size/type fields are repeated in adjacent memory... that's all it is... So you asked for:

D MasterList_T...
D DS qualified based(TEMPLATE)
D Customer...
D 6s 0
D Rank...
D 6s 0

If you did use an array (just bear with me) you'd code it like this:

D myMasterList...
D DS likeds(MasterList_T)
D dim(5)

That means that each entry in your array is (6+6=) 12 bytes long. So this being an array, the space in memory would be organized as follows:

bytes 0-11 = first element
bytes 12-23 = second element
bytes 24-35 = third element
bytes 36-47 = fourth element
bytes 48-59 = fifth element

Hopefully you see... they are just 12 byte chunks located in consecutive memory locations. The second element of the array is %size(MasterList_t) bytes later in memory than the first one. The third element in the array is %size(MasterList_t) bytes after the second one, and so on...

in other words... the formula is:

memory location = (elementno - 1) * %size(MasterList_t)

If I wanted to get the first element, I'd say 1-1=0. 0*12=0. Start at offset 0 from the start of the array, and I have the first element.

If I wanted to get the fourth element, I'd say 4-3=3. 3*12=36. The fourth element is 36 bytes from the start of the array -- in other words, it's at offset 36. (Or byte position 36 if you like.)

So with that, why do we need a dim? Who cares about the DIM?

Redefine myMasterList as follows:

D p_WholeArray s *
D p_OneElement s *

D myMasterList ds likeds(MasterList_t)
D based(p_OneElement)

Now let's say we want to have 50 elements in the array:

/free
max = 50;
p_WholeArray = %alloc(max * %size(MasterList_t));

If I want to put data into element #42 (since that is *the* answer) I could do:

x = 42;
p_OneElement = p_WholeArray + (x-1) * %size(MasterList_t);
myMasterList.Customer = 123456;
myMasterList.Rank = 100001;

If I wanted to test the rank of element 10, I could do:

x = 10;
p_OneElement = p_WholeArray + (x-1) * %size(MasterList_t);
if (myMasterList.Rank > 123456);
... do something...
endif;

If I later decided that 50 elements is not nearly enough, I could extend my array, too... maybe I want 50000 elements (more than 32767!) I could do this:

max = 50000;
p_OneElement = *null;
p_WholeArray = %realloc( p_WholeArray
: %size(Masterlist_t) * max);

Note that the existing entries (such as #42) will still be in my array data... but the system may have changed the address in memory that they are stored at. (The offsets will be the same, but the starting address might not.) Therefore, I set p_OneElement to *null, that way I won't accidentally use that area of memory (which is no longer valid.) It just makes bugs in my program easier to spot...

Now, just as before, if I want to read element #42 (which, again, should still be there) I can do this:

x = 42;
p_OneElement = p_WholeArray + (x-1) * %size(MasterList_t);
msg = '#42 is for customer ' + %char(myMasterList.customer);

But now if I want to access element #49876, I can do this:

x = 49876;
p_OneElement = p_WholeArray + (x-1) * %size(MasterList_t);
myMasterList.customer = xyz;
myMasterList.rank = pdq;

I _do_ recommend encapsulating as much of the pointer logic as possible into a service program, and subprocedures.... I didn't do it in this message, because I wanted to teach you how it works, not write the code for you :) (And because I'm short on time, and this message already took more than 30 mins to write!)

-SK

As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:
Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.