Unlike cycle main programs, linear main programs do not include the RPG cycle.
Editor’s note: This article is excerpted from Programming in ILE RPG, Fifth Edition, chapter 14, “Building Modular Programs with Procedures.”
RPG supports a second type of program (as an alternative to cycle main programs) that does not include the RPG cycle. A linear main program explicitly names a procedure to be the main procedure for the program. A linear main program includes a Ctl-opt instruction with the Main keyword to name the main procedure:
Ctl-opt Main(proc-name);
You then code the main procedure just as any other subprocedure, starting with a Dcl-proc instruction and ending with an End-proc instruction. The main section in a linear main program (before the first Dcl-proc instruction) does not contain any executable code, although it can include global declarations.
The RPG compiler will not embed the RPG cycle into a linear main program. A linear main program implicitly initializes variables, locks data areas, and opens files when the program starts, but these resources are not cleaned up or closed when the program ends, unless the program explicitly does so, using RPG operations. A linear main program does not use *Inlr to trigger such an automatic shutdown.
To understand the basic coding requirements for a linear main program, let’s modify the earlier cycle main program to now be a linear main program. Notice the highlighted differences between this program and the earlier cycle main program.
// ----------------------------------------------------
//
// Program – THISPGM – Displays Celsius temperature and
// corresponding water state
//
// ----------------------------------------------------
Ctl-opt Main(Driver);
// ----------------------------------------- Prototypes
Dcl-pr Driver Extpgm('THISPGM');
*N Int(5);
End-pr;
Dcl-pr Celsius Int(5);
*N Int(5);
End-pr;
// ----------------------------------------------------
//
// Main procedure
//
Dcl-proc Driver;
// ------------------------------ Procedure interface
Dcl-pi *N;
Englishtemp Int(5);
End-pi;
// ---------------------------------- Local variables
Dcl-s Message Char(50);
Dcl-s Metrictemp Int(5);
Dcl-s State Varchar(8);
Metrictemp = Celsius(Englishtemp);
Select;
When Metrictemp < 0;
State = 'solid';
When Metrictemp = 0;
State = 'freezing';
When Metrictemp = 100;
State = 'boiling';
When Metrictemp > 100;
State = 'gaseous';
Other;
State = 'liquid';
Endsl;
Message = 'At ' + %Char(Englishtemp) + ' degrees (' +
%Char(Metrictemp) + ' Celsius), water is ' +
State + '.';
Dsply Message;
Return;
End-proc Driver;
// ----------------------------------------------------
//
// Procedure – Celsius – Converts Fahrenheit to Celsius
//
Dcl-proc Celsius;
// ------------------------------ Procedure interface
Dcl-pi *N Int(5);
Fahrenheit Int(5);
End-pi;
// ---------------------------------- Local variables
Dcl-s Temperature Int(5);
Eval(H) Temperature = (5/9) * (Fahrenheit - 32);
Return Temperature;
End-proc Celsius;
The first difference is the addition of the Ctl-opt instruction to name the program’s main procedure, Driver (it can be any valid name). The Main keyword to name the main procedure is the key to creating the linear main program. The Driver procedure will be coded with other subprocedures, but it will be the first user-written code to execute when the program starts. You code the prototype for the Driver procedure in the global declarations section of the program. The Extpgm keyword indicates the name of the program: THISPGM.
The Driver procedure begins with a Dcl-proc instruction and ends with an End-proc instruction. The first declaration in Driver is its procedure interface. All the variables are local variables, restricted to the procedure in which they are declared. Like the main procedure in the earlier program, the Driver procedure in this program accepts a single parameter, Fahrenheit, and then executes the Celsius subprocedure to convert that value to Celsius. It then assigns a state and displays a message.
Unlike in the earlier program, the Driver main procedure does not set *Inlr to implicitly close the program; instead, the program ends when it encounters the Return operation. Note that any open files or locked data areas, without the presence of explicit Close or Unlock operations, will remain open or locked after the program ends.
The result of running this program is the same as the earlier cycle main program. But a linear main program does not include logic for the RPG cycle. While it cannot use the automatic features of the cycle, a linear main program also avoids any possible performance impact of the cycle, however minimal it may be. In addition, a linear main program is recursive. Unlike a cycle main program, a linear main program can call itself for those applications where recursive calls are necessary.
Choosing which type of program to code, cycle main or linear main, is largely a matter of style, preference, and shop standards. Most traditional programs use the cycle main model. Many newer programs (and newer programmers) tend toward the linear main model, which is similar to that of other computer languages. Unless your program requires RPG cycle features—most notably using *Inlr to close the program—the runtime differences between the two models are negligible.
LATEST COMMENTS
MC Press Online