Thanks for the detailed response.
So I'm clear, if I change the prototype to use ExtProc, I only need to recompile any programs that use that specific procedure, correct? Or do I need to recompile all programs that use the service program? If the former is true, I think making the change is reasonable, if not, I'll likely write a wrapper procedure as you suggest.
Thanks again,
Kurt
-----Original Message-----
From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx] On Behalf Of Scott Klement
Sent: Tuesday, October 11, 2011 2:38 PM
To: RPG programming on the IBM i / System i
Subject: Re: 1 byte return parameter to CL
Hi Kurt,
I have a procedure that returns a 1A value and is called by a CL.
The CL's variable is defined as *CHAR and LEN(1). The procedure
prototype does not have ExtProc(*CL). So, why is the program working?
I've debugged it and saw that it is getting the correct value.
I wouldn't rely on that behavior. You may just be "getting lucky". Or, it may be working today, and may fail in the future. Until IBM tells us that this approach is okay, we should stick to using ExtProc(*CL)
I went in and changed the variable in CL to be 2 bytes, per a number
of postings I found on the web as a workaround,
At one time, this was even published as a workaround in the IBM manuals.
BUT... don't use this technique anymore! This technique worked only in
V5R4 and earlier releases. IBM documented this as a "change in
behavior" in the IBM i 6.1 Memo to Users as a behavior change in ILE.
It will not work after V5R4.
It's much better to fix it properly, and add ExtProc(*CL)
If you have a lot of existing callers (routines calling the
subprocedure) and are reluctant to make a change that requires
recompiling all of those callers, then use a wrapper routine.
Wrapper example... let's say you have an existing routine called
TheProc() that's called by many RPG programs (that you don't want to
recompile):
D TheProc PR 1a
D SomeParm 22a const
Now you want to create a wrapper. A Wrapper is a simple subprocedure
that does nothing else besides change/fix the parameters, and call the
original procedure. So you might have this:
D TheProcCL PR 1a extproc(*CL:'THEPROCCL')
D SomeParm 22a const
.
.
D TheProcCL PI
D SomeParm 22a const
/free
return TheProc( SomeParm );
/end-free
CL programs can call TheProcCL, and will work nicely because it has been
coded with ExtProc(*CL). The existing RPG callers don't have to change,
and can keep calling TheProc() as before.
-SK
As an Amazon Associate we earn from qualifying purchases.