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