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



thanks for the correction, Hans.

I dont like this mixing of pointer and reference that rpg forces on
programmers. For one, there is the error that Hans pointed out in my c++
proc. There is also a performance consideration when deciding how large the
pass by reference parm should be.  But mostly, I think it makes rpg code
harder to read and learn.

here is the prototype of the "IfsWrite" function:

** ----------------------- IfsWrite -------------------
** IfsWrite - write to an IFS file
DIfsWrite         PR            10I 0 EXTPROC('write')
D hInFile                       10I 0 VALUE
D pInData                         *   VALUE
D InDataLx                      10U 0 VALUE

It is prototyped as the function is documented. The "write" function
receives a pointer to the data to write to the file.

As prototyped, this function cant be called from rpg in all instances
because of the const thing.  For rpg, the proc has to be prototyped as so?

DIfsWrite         PR            10I 0 EXTPROC('write')
D hInFile                       10I 0 VALUE
D InData                     32767a   const options(*VarSize)
D InDataLx                      10U 0 VALUE

So if the "IfsWrite" proc is called with a 10 char varying string, the
compiler will copy first into a blank filled 32767 temporary.

-Steve



-----Original Message-----
From: rpg400-l-bounces@xxxxxxxxxxxx
[mailto:rpg400-l-bounces@xxxxxxxxxxxx]On Behalf Of Hans Boldt
Sent: Monday, August 11, 2003 1:41 PM
To: rpg400-l@xxxxxxxxxxxx
Subject: Re: Value vs. Const


First, that C++ function GetPtrToArg() is one way to "lie" to the
RPG compiler. It could be written using some simpler C code such as:

---------------------------
void * fun(void *ptr)
{ return ptr; }
---------------------------

Second, that function shouldn't be needed if the prototype for the
procedure IfsWrite() defines the string parameter as "CONST
OPTIONS(*VARSIZE)", instead of as a basing pointer.

Third, that code fragment probably doesn't work anyways. (Or doesn't
work reliably.) In the statement "pData=fGetPtrToConst(InData);",
since the input parameter doesn't match the parameter prototype
(one's fixed length char, the other's varying), the value should get
assigned to some compiler generated temp. The address returned by
the function would be the address of the compiler generated temp,
and not the address of the original CONST parameter. It may work
now, but if the temp is handled differently by the compiler in the
future, the code may break on recompile, with or without any source
code change within the procedure.

Cheers! Hans

PS. It's Monday - have a nice day!


Peter Dow wrote:
> Hi Steve,
>
> Thanks for the reply.  I didn't know the iSeries had C++.  Otoh, given
what
> little I know about C or C++, the code you posted looks like C.  The
problem
> is how you use it.  Isn't your RPG code just getting the pointer to
InChar,
> not InData?  Or is it just that it's Monday a.m. and my brain isn't
ticking
> over yet?  And what's a "mutable" pointer?
>
> Peter Dow
> Dow Software Services, Inc.
> 909 793-9050 voice
> 909 793-4480 fax
> 909 522-3214 cell
>
> From: "Steve Richter"
>
>>here is an ile c++ function that will return a mutable pointer to an rpg
>>const variable:
>>
>>#include <stdio.h>
>>#include <errno.h>
>>void* GetPtrToArg( char& cIn )
>> {
>> void* pVoid ;
>> pVoid   = &cIn ;
>> return  pVoid ;
>> }
>
>
>
>
>>** ----------------------- fGetPtrToConst -------------------------
>>d fGetPtrToConst  pr              *   extproc('GetPtrToArg__FRc')
>>d InChar                     32767a   const options(*VarSize)
>>
>>** ---------------------- fIfsWrite -----------------------------
>>** fIfsWrite - write string to IFS file
>>** hInFile       fComRef.hFile   open ifs file handle
>>** InData        vstr(*)        string to write to file.
>>pfIfsWrite        b                   export
>>dfIfsWrite        pi            10i 0
>>d hInFile                             value like(fComRef.hFile)
>>d InData                     32767a   const varying options(*VarSize)
>>
>>d WriteCx         s             10i 0
>>d pData           s               *
>> /free
>>      pData       = fGetPtrToConst( InData ) ;
>>      WriteCx     = IfsWrite( hInFile:
>>                              pData:
>>                              %len(InData)) ;
>>      return      WriteCx ;
>> /end-free
>>p                 e
>>
>>
>>( curious to know how else to write the proc that uses this const breaking
>>function )
>
>
>
>
> ---
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.507 / Virus Database: 304 - Release Date: 8/6/2003
>
>
> _______________________________________________
> This is the RPG programming on the AS400 / iSeries (RPG400-L) mailing list
> To post a message email: RPG400-L@xxxxxxxxxxxx
> To subscribe, unsubscribe, or change list options,
> visit: http://lists.midrange.com/mailman/listinfo/rpg400-l
> or email: RPG400-L-request@xxxxxxxxxxxx
> Before posting, please take a moment to review the archives
> at http://archive.midrange.com/rpg400-l.
>
>


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



As an Amazon Associate we earn from qualifying purchases.

This thread ...

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.