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



Scott,

Sorry, I was thinking array but I still call them MODS a lot.

Thanks for the explanation.

Rick

> -----Original Message-----
> From:
> rpg400-l-bounces+rick.chevalier=americredit.com@xxxxxxxxxxxx
> [mailto:rpg400-l-bounces+rick.chevalier=americredit.com@midran
> ge.com] On Behalf Of Scott Klement
> Sent: Wednesday, May 24, 2006 11:41 AM
> To: RPG programming on the AS400 / iSeries
> Subject: RE: Pointer / Based issue
>
>
> >
> > What about MODS?  Would all occurrences be available?
> >
>
> IBM hasn't created a prototype keyword to pass a MODS
> properly.  I think this has to do with the bizarre nature of
> a MODS -- you can't unambiguously reference a particular
> element when you use the variable name!  You have to select
> the element name with the OCCUR opcode or the %OCCUR BIF, and
> this makes it very difficult for the compiler to know the
> difference between the current occurrence and the whole structure.
>
> Data structure arrays are a better choice, and I suggest that
> you use them instead of a MODS.  Always.
>
> But, since I know that not everyone will do that, here's how
> you pass a
> MODS:
>
> A MODS is always stored in contiguous memory.  The second
> occurrence is always immediately after the first occurrence,
> the third is always immediately after the 2nd, etc. 
> Therefore, if you can get a pointer to the first occurrence,
> and base an identical MODS on that pointer, you'll be good to go.
>
> For example:
>
>       D TestMods        ds                  occurs(50)
>       D    field1                     10A
>       D    field2                      9P 0
>
>       D IsModsOk        PR             1N
>       D    mods                             like(TestMods)
>
>        /free
>
>             %occur(TestMods) = 1;
>
>             if IsModsOk(TestMods);
>                 // there was much rejoicing
>             endif;
>           .
>           .
>           .
>       P IsModsOk        B
>       D IsModsOk        PI             1N
>       D    mods                             like(TestMods)
>       D MyMods          ds                  occurs(50)
>       D                                     based(p_Mods)
>       D    field1                     10A
>       D    field2                      9P 0
>        /free
>            p_Mods = %addr(mods);
>            // MyMods is now the MODS from the caller, starting
>            //   with the occurence that the caller had set when
>            //   he called this procedure.
>        /end-free
>       P                 E
>
> This is better than declaring a pointer on the prototype because:
>
> a) The caller doesn't have to do any pointer logic to call
> you.  You should always make it as easy for the caller as
> possible when writing re-usable routines!
>
> b) The use of LIKE on the prototype makes it more
> self-documenting that this is what you want passed for this parameter.
>
>
> However, it obviously doesn't work as nicely because:
>
> a) You have to set the occurrence before calling.
>
> b) You have to do pointer logic in the called procedure
>
> c) You have to make a 2nd copy of the DS layout.
>
> d) You can't use CONST to improve and clarify the interface.
>
>
> So, again, I recommend using a data structure array instead. 
> They work
> almost exactly like MODS, so I don't understand why you'd use a MODS.
>
>       D TestArray       ds                  dim(50)
>       D                                     qualified
>       D    field1                     10A
>       D    field2                      9P 0
>
>       D IsArrayOk       PR             1N
>       D    ary                              likeds(TestArray)
>       D                                     dim(50)
>
>        /free
>
>             if IsArrayOk(TestArray);
>                 // there was much rejoicing
>             endif;
>
>       P IsArrayOk       B
>       D IsArrayOk       PI             1N
>       D    ary                              likeds(TestArray)
>       D                                     dim(50)
>        /free
>            for x = 1 to %elem(ary);
>                if ( ary(x).field1 = 'foo' );
>                    return *OFF;
>                endif;
>            endif;
>        /end-free
>       P                 E
>

Privileged and Confidential.  This e-mail, and any attachments there to, is 
intended only for use by the addressee(s) named herein and may contain 
privileged or confidential information.  If you have received this e-mail in 
error, please notify me immediately by a return e-mail and delete this e-mail.  
You are hereby notified that any dissemination, distribution or copying of this 
e-mail and/or any attachments thereto, is strictly prohibited.


As an Amazon Associate we earn from qualifying purchases.

This thread ...


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.