|
> From: Scott Klement
>
> Hi Joe,
>
> Just curious, but doing it that way, why not use a MODS or an array of
> qualified structures? Then you wouldn't have to use pointer math to
walk
> through the list. (Though, you'd still have to use it to set the
start of
> the list.)
Unless I miss my guess, with a MODS or an array of structures, I have to
predefine the number of entries. I use the technique shown whenever the
size of the structure is known but the number of entries is not; it
allows me to avoid having to specify the maximum number of entries the
API can handle.
If RPG allowed me to pass a pointer to an array of structures and let me
easily determine the size directly from the passed array, I might be
able to do something similar. Not knowing how to do that, this
technique is a good substitute, working quite nicely when the caller
knows how many entries need to be processed but the callee does not.
I can write the called procedure to handle any arbitrary number of
entries, but the actual number allocated depends on the calling
application. It's a personal preference based on being bitten one too
many times by fixed array sizes, while at the same time not wanting to
create arrays with an arbitrarily large size.
> I was actually using this with the system "List APIs" however, and the
> size of each entry is not necesarily a fixed number. (or, even if it
is,
> it can change from release to release, which would break the code the
way
> you've written it)
Well, I did say pretty specifically that the entries need to be a
predefined size based on an external data structure. I couldn't tell
from your example whether EntrySize was a variable or a constant.
If it were based on a data structure, it would be a pretty simple
recompile for each release. But if you don't like that, well, do simple
pointer arithmetic: pointer = header + offset + (entry-1) * size.
Or, if your size changes every time, then do this:
EntrySize = 0;
Pointer = header + offset;
For x = 1 to numEntries
Pointer = Pointer + EntrySize;
(...)
EntrySize = SizeOfCurrentEntry;
Endfor
There are several ways to do it without the nested if logic. Like I
said, I just showed my little array magic as an example.
Joe
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 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.