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



Barbara Morris wrote on Tuesday, June 25, 2013

You need EXTPGM on the prototype if you're _ever_ going to call the
program from RPG. In that case, the prototype goes in a /copy file and
gets copied into the program source itself, and into all the source that
calls it.
So you're doing it right, by putting the prototypes in a /copy file with
EXTPGM.
7.1: If you're _never_ going to use the prototype to call the program
from RPG, then don't bother coding the prototype at all. Just code the
PI without a name and without EXTPGM.
<= 6.1: If you're _never_ going to call the program from RPG, put the
prototype in the program source, and you don't need the EXTPGM. But
remember that if you don't code EXTPGM, the prototype name has to match
the module. Without EXTPGM, you're technically coding a prototype for
the main procedure, not for the program.
Examples of programs that will never be called by RPG:
- command processing programs
- exit point programs
- throwaway hacks for casual testing
- (possibly) programs only intended to be called by CL

Barbara, thank you for clearly outlining "best practice" for coding PR/PI to replace the old-style *ENTRY PLIST.

The (RPG Reference) Manual confused me somewhat. In the V7.1 "What's
New" section it states:
"Optional prototypes
If a program or procedure is not called by another RPG module, it is
optional to specify the prototype. The prototype may be omitted for the
following types of programs and procedures:
- A program that is only intended to be used as an exit program or as the
command-processing program for a command
- A program that is only intended to be called from a different programming
language <<<<<
- A procedure that is not exported from the module
- A procedure that is exported from the module but only intended to be
called from a different programming language"

The above text suggests Program A cannot call Program B if both programs are
written in RPG _and_ Program B has no prototype defined within the module.
This has never made sense to me. But perhaps I am misinterpreting?

The following example works perfectly well - now that we can specify EXTPGM
on the PI in Program B. Yet the code appears to contradict the Manual.
========================================
// Module/program name is PROGRAMA
D CallParms Pr ExtPgm('PROGRAMB')
D 10A Const
D String S 10A Inz('String 8')
/Free
CallP CallParms(String);
*InLR = *On;
/End-Free
========================================
// Module/program name is PROGRAMB
// No Prototype (PR)
D EntryPlist Pi ExtPgm('PROGRAMB')
D String 10A Const
/Free
Dsply String '*REQUESTER';
*InLR = *On;
/End-Free
========================================
PLEASE NOTE: I am _not_ suggesting the above example is good practice! I appreciate it would be far wiser to code the prototype in a separate source member and /COPY in both of the above programs.

I know I am "splitting hairs" and probably wearing out my welcome. The reason I am trying to nail down the semantics is because the above example is an easier starting point from which to teach the use of PI/PR to students familiar with the old PLIST way of doing things. (Duplicating the PR is both Caller and Called programs does not make a good impression at first look.)

I agree wholeheartedly that using /COPY to embed the PR in both programs is desirable for building more robust code. (I do come across installations where standards expressly forbid the use of /COPY - hence another appeal of the V7.1 enhancements.)

Thanks again for everyone's patience!
Brian Parkins.


As an Amazon Associate we earn from qualifying purchases.

This thread ...

Follow-Ups:
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.