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


  • Subject: RE: Passing pointers as parms
  • From: Joel Fritz <JFritz@xxxxxxxxxxxxxxxx>
  • Date: Tue, 28 Nov 2000 13:03:44 -0800

I realize you're passing by reference on dynamic calls and have no choice in
the matter.  All I was trying to point out was that by doing a couple of
things in the D specs you could write simpler _looking_ code. i.e. avoid
hooking the data structure to the parameter in the C specs.  

The thing that is perplexing to me is that it worked.  I tend to think of
this in terms of what I learned about C where parameter passing is by value
by default.  In C when you pass a pointer the function that receives it
operates on the value contained in the memory location by use of the
dereferencing operator.  If you're passing a pointer by reference, you're
passing a reference to a pointer (the address of the memory space that
contains the address of the memory space that contains the address of the
data) and it appears there's some dereferencing by magic going on.  It seems
like the data structure based on the pointer passed by reference shouldn't
have a direct link to the data structure in the calling program.  Although,
come to think of it, if you pass a pointer to a sub procedure that's defined
within a program it acts like it was passed by value too.

I think I'm out of my depth here.  Maybe I'll try to learn alternating
arrays instead. <g>  
  

> -----Original Message-----
> From: jpcarr@TREDEGAR.COM [mailto:jpcarr@TREDEGAR.COM]
> Sent: Tuesday, November 28, 2000 10:50 AM
> To: RPG400-L@midrange.com
> Subject: RE: Passing pointers as parms
> 
> 
> 
> Joel
> 
> ReRead my earlier post about passing by Reference on a dynamic call.
> Since you didn't use the VALUE keyword on your pointer parm,   You are
> still (like the dynamic call)
> passing by Reference.
> 
> John
> 
> 
> 
>                                                               
>                                   
>                     Joel Fritz                                
>                                   
>                     <JFritz@sharperim        To:     
> "'RPG400-L@midrange.com'"                  
>                     age.com>                 
> <RPG400-L@midrange.com>                            
>                     Sent by:                 cc:              
>                                   
>                     owner-rpg400-l@mi        Subject:     RE: 
> Passing pointers as parms         
>                     drange.com                                
>                                   
>                                                               
>                                   
>                                                               
>                                   
>                     11/28/2000 01:06                          
>                                   
>                     PM                                        
>                                   
>                     Please respond to                         
>                                   
>                     RPG400-L                                  
>                                   
>                                                               
>                                   
>                                                               
>                                   
> 
> 
> 
> 
> Maybe it was something like this:
> 
> You have a data structure in your calling program you want to 
> update in the
> called program.  If you pass a pointer, which appears to be 
> legal and well
> behaved in the very limited test I just ran, all you do is 
> copy the data
> structure definition into the called program and base it on 
> the pointer
> that's passed in.  It's the same thing you're doing with 
> slightly and maybe
> even inconseqentially fewer lines of code.  You are 
> absolutely right that
> passing by reference is passing by reference and that's the 
> default in RPG.
> Here's my test:
> 
>                      Calling program:
> 
> Fqsysprt   o    f   80        printer
> 
> D ptrtst2         pr                  extpgm('PTRTST2')
> 
> D pointer                         *
> 
> D
> 
> D datastruct      ds
> 
> D packed                         5p 0 inz(99999)
> D char                           5    inz('five')
> 
> D
> 
> D ptrparm                         *   inz(%addr(datastruct))
> C
> 
> C                   except    before
> 
> C                   callp     ptrtst2(ptrparm)
> C                   except    after
> 
> C                   eval      *inlr = *on
> 
> Oqsysprt   e            before
> 
> O                                              'Before--packed = '
> 
> O                       packed        j
> 
> O                                           +1 'char = '
> 
> O                       char
> 
> O          e            after
> 
> O                                              'After--packed = '
> 
> O                       packed        j
> 
> O                                           +1 'char = '
> 
> O                       char
> 
> 
> 
>                       Called program:
> 
> D ptrtst2         pr
> 
> D pointer                         *
> 
> D
> 
> D ptrtst2         pi
> 
> D pointer                         *
> 
> D
> 
> D datastruct      ds                  based(pointer)
> D packed                         5p 0
> 
> D char                           5
> 
> D
> 
> C                   eval      packed = 11111
> 
> C                   eval      char = 'after'
> 
> C                   eval      *inlr = *on
> 
> 
> > -----Original Message-----
> > From: Scott Klement [mailto:klemscot@klements.com]
> > Sent: Tuesday, November 28, 2000 9:08 AM
> > To: RPG400-L@midrange.com
> > Subject: Re: Passing pointers as parms
> >
> >
> >
> > If this is a program calling a program (within the same job)
> > the program
> > _is_ (implicitly) passing a pointer...     Thats the way
> > parameters work,
> > they're passed by "reference" (i.e. a reference to an 
> address in main
> > storage)
> >
> > The exception to this, of course, is when using something
> > like QCMDEXC or
> > SBMJOB...
> >
> > So I'm a bit confused as to why you want to pass a pointer
> > instead of the
> > buffer directly?   if you really want to just pass the
> > pointer, you could
> > do something like this:
> >
> > Program 1:
> >
> > D MyBuffer        S          32766A
> > D pointer         S               *   inz(%addr(MyBuffer))
> > D MyField         S              1A   based(pointer)
> > C                   CALL      'PROGRAM2'
> > C                   PARM                    MyField
> >
> >
> > Program 2:
> >
> > D pointer         S               *
> > D MyField         S              1A
> > D MyBuffer        S          32766A     based(pointer)
> > C     *ENTRY        PLIST
> > C                   PARM                    MyField
> > C                   eval      pointer = %addr(MyField)
> >
> >
> > But this would yield the same exact results as just passing 
> "MyBuffer"
> > directly... so why would you bother??
> >
> +---
> | This is the RPG/400 Mailing List!
> | To submit a new message, send your mail to RPG400-L@midrange.com.
> | To subscribe to this list send email to RPG400-L-SUB@midrange.com.
> | To unsubscribe from this list send email to 
> RPG400-L-UNSUB@midrange.com.
> | Questions should be directed to the list owner/operator:
> david@midrange.com
> +---
> 
> 
> 
> +---
> | This is the RPG/400 Mailing List!
> | To submit a new message, send your mail to RPG400-L@midrange.com.
> | To subscribe to this list send email to RPG400-L-SUB@midrange.com.
> | To unsubscribe from this list send email to 
> RPG400-L-UNSUB@midrange.com.
> | Questions should be directed to the list owner/operator: 
> david@midrange.com
> +---
> 
+---
| This is the RPG/400 Mailing List!
| To submit a new message, send your mail to RPG400-L@midrange.com.
| To subscribe to this list send email to RPG400-L-SUB@midrange.com.
| To unsubscribe from this list send email to RPG400-L-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: david@midrange.com
+---

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.