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