× 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.



You're right Craig - the pointer approach you describe is a very dangerous practice. I've seen it cause so many errors over the years that my presentation on this array technique includes a chart that says "If you see this technique in a program kill it before it kills you"

You can _never_ rely on two fields in an RPG record being contiguous in memory _unless_ you have engineered the situation by using a DS.


Jon Paris

www.partner400.com
www.SystemiDeveloper.com

On Jun 13, 2018, at 9:09 AM, Craig Richards <craig@xxxxxxxxxxxxxxxx> wrote:

Interesting Idea to use the Prefix to map the file and DS together.
I hadn't thought of that.

I agree that Birgitta's solution is the most robust and clear.

In practice, mostly I've used a solution like Dave's as it means you don't
have to type the fields into an array.

At first glance it might seem ok to just define an array based on a pointer
and initialise the pointer to the address of the first repeating field from
the file, without using any datastructures

e.g

Dcl-S Cam like( Camtday01 ) dim(32) based(pCam)
Dcl-S pCam Pointer Inz( %Addr( Camtday01 ) )

And you might get away with this approach, but it makes the assumption that
the compiler has put all of the Camtdaynn fields in the right order in a
contiguous chunk of memory.
And that is probably the case. But not always.
I saw what seemed a weird bug with this approach at an old client's site
and when I looked more closely I could see that the data, while confusing,
wasn't random.
There were two sets repeating fields on the database file that were defined
in the order S1,S2,S3..S32, F1,F2, F3... F32. but they were being stored in
memory in the order
S1F1, S1F2, S3F3... S32F32
I believe that the latter sequence was how the file had originally been
defined and then it was modified to group the S and F fields together. I
never quite fully understood why the old sequence of the file was hanging
around but I guessed it might be due to a shared access path when the file
was being recreated.

So, you really need to use a data structure with the array fields on it to
guarantee the order they will be stored in memory, so you can define an
array over the same memory location.

I've tended to use an *unqualified *data structure, but with the same
prefix as the file to do this e.g:
Dcl-f ChnlAnalp ... prefix( Cha_ )
Dcl-DS ChnDS ExtName( 'CHNLANALP') prefix( Cha_ )

Then you know the fields are contiguous in memory.
I would then define the array using a pointer as before:
Dcl-S Cam like( Camtday01 ) dim(32) based(pCam)
Dcl-S pCam Pointer Inz( %Addr( Cha_Camtday01 ) )

A Last gotcha I occasionally fall foul of is to define the data structure
inside a subprocedure.
That approach won't work for global files, you'll simply end up masking the
file's fields by your own local variables that have the same name.

happy days,
Craig





On 12 June 2018 at 20:14, <dlclark@xxxxxxxxxxxxxxxx> wrote:

"RPG400-L" <rpg400-l-bounces@xxxxxxxxxxxx> wrote on 06/12/2018 03:03:58
PM:
Personally, if I understand Dave's solution correctly, I like his
better.
With the solution you're using, you are relying on field Camtday01
starting
in position 97 forever. What happens if you ever change the length of a
field in this record before Camtday01? The program will recompile just
fine, but will likely bomb once you run it because it is expecting your
array to start in position 97 but it doesn't anymore. If you're really
unlucky, it won't bomb, but will give bad results that you might not
recognize until it's too late.

With Dave's solution, again if I understand it correctly, you don't have
to
rely on Camtday01 starting in position 97. Instead, it will use the
address
of Camtday01 as the starting point, no matter where it is actually
located
in the record.


And lest anyone misunderstand exactly what was suggested vs. what
was implemented... Alan combined two different suggestions to come up
with his solution. What Birgitta suggested is not what Alan implemented.
Birgitta's suggestion would work just fine even if the fields shifted in
the record. I use my suggestion (because it is less work to code) in the
case that the fields are actually contiguous in the record. I would use
Birgitta's suggestion when they are not -- although, as I said, her
suggestion would work in either case.


Sincerely,

Dave Clark
--
int.ext: 91078
direct: (937) 531-6378
home: (937) 751-3300

Winsupply Group Services
3110 Kettering Boulevard
Dayton, Ohio 45439 USA
(937) 294-5331




************************************************************
*********************************
This email message and any attachments is for use only by the named
addressee(s) and may contain confidential, privileged and/or proprietary
information. If you have received this message in error, please
immediately notify the sender and delete and destroy the message and all
copies. All unauthorized direct or indirect use or disclosure of this
message is strictly prohibited. No right to confidentiality or privilege
is waived or lost by any error in transmission.
************************************************************
*********************************
--
This is the RPG programming on the IBM i (AS/400 and iSeries) (RPG400-L)
mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at https://archive.midrange.com/rpg400-l.

Please contact support@xxxxxxxxxxxx for any subscription related
questions.

Help support midrange.com by shopping at amazon.com with our affiliate
link: http://amzn.to/2dEadiD

--
This is the RPG programming on the IBM i (AS/400 and iSeries) (RPG400-L) mailing list
To post a message email: RPG400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/rpg400-l
or email: RPG400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at https://archive.midrange.com/rpg400-l.

Please contact support@xxxxxxxxxxxx for any subscription related questions.

Help support midrange.com by shopping at amazon.com with our affiliate link: http://amzn.to/2dEadiD


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.