HP OpenVMS Systems Documentation |
HP COBOL
|
Previous | Contents | Index |
Sample Run of GETROOT (OpenVMS)
$ RUN GETROOT [Return] Enter number (with decimal point): 25. [Return] The square root is: 5.000000 5.0000 Enter number (with decimal point): )HELLO [Return] ** INVALID ARGUMENT FOR SQUARE ROOT Enter number (with decimal point): 1000000. [Return] The square root is: 1000.000000 1,000.0000 Enter number (with decimal point): 2. [Return] The square root is: 1.414214 1.4142 Enter number (with decimal point): [Return] $ <> |
The rich, yet easily accessed features of BASIC make that language a natural environment for development of short routines to be called from COBOL. Example 12-15 shows one example of an HP COBOL program that calls a BASIC program.
Example 12-15 Calling a BASIC Program from a COBOL Program |
---|
IDENTIFICATION DIVISION. PROGRAM-ID. APPL. ****************************************************** * This COBOL program accepts credit application * * information and passes this information to a BASIC * * program that performs a credit analysis. Notice * * that the data passed to the BASIC program is in * * the standard binary format. * ****************************************************** DATA DIVISION. WORKING-STORAGE SECTION. 01 APPLICATION-NUMBER PIC 999. 01 C-APPLICATION-NUMBER PIC 9(3) COMP. 01 ANNUAL-SALARY PIC 9(5). 01 C-ANNUAL-SALARY PIC 9(5) COMP. 01 MORTGAGE-RENT PIC 999. 01 C-MORTGAGE-RENT PIC 9(3) COMP. 01 YEARS-EMPLOYED PIC 99. 01 C-YEARS-EMPLOYED PIC 9(2) COMP. 01 YEARS-AT-ADDRESS PIC 99. 01 C-YEARS-AT-ADDRESS PIC 9(2) COMP. PROCEDURE DIVISION. 010-BEGIN. DISPLAY "Enter 3 digit application number". ACCEPT APPLICATION-NUMBER. IF APPLICATION-NUMBER = 999 DISPLAY "All applicants processed" STOP RUN. MOVE APPLICATION-NUMBER TO C-APPLICATION-NUMBER. DISPLAY "Enter 5 digit annual salary". ACCEPT ANNUAL-SALARY. MOVE ANNUAL-SALARY TO C-ANNUAL-SALARY. DISPLAY "Enter 3 digit mortgage/rent". ACCEPT MORTGAGE-RENT. MOVE MORTGAGE-RENT TO C-MORTGAGE-RENT. DISPLAY "Enter 2 digit years employed by current employer". ACCEPT YEARS-EMPLOYED. MOVE YEARS-EMPLOYED TO C-YEARS-EMPLOYED. DISPLAY "Enter 2 digit years at present address". ACCEPT YEARS-AT-ADDRESS. MOVE YEARS-AT-ADDRESS TO C-YEARS-AT-ADDRESS. CALL "APP" USING BY REFERENCE C-APPLICATION-NUMBER C-ANNUAL-SALARY C-MORTGAGE-RENT C-YEARS-EMPLOYED C-YEARS-AT-ADDRESS. GO TO 010-BEGIN. |
Example 12-16 BASIC Program "APP" and Output Data |
---|
10 SUB APP (A%,B%,C%,D%,E%) 40 IF A% = 999 THEN 999 50 IF B% => 26000 THEN 800 60 IF B% => 18000 THEN 600 70 IF B% > 15000 THEN 500 80 IF B% => 10000 THEN 400 90 GO TO 700 400 IF E% < 4 THEN 800 410 IF D% < 2 THEN 800 420 GO TO 800 500 IF E% < 4 THEN 700 510 GO TO 800 600 LET X% = B% / 12 650 IF C% => X%/4 THEN 670 660 GO TO 800 670 IF E% => 4 THEN 800 700 PRINT TAB(1);"APPLICANT NUMBER ";A%; " REJECTED" 710 GO TO 999 800 PRINT TAB(1);"APPLICANT NUMBER ";A%;" ACCEPTED" 999 SUBEND |
$ RUN APPL Enter 3 digit application number 376 [Return] Enter 5 digit annual salary 35000 [Return] Enter 3 digit mortgage/rent 461 [Return] Enter 2 digit years employed by current employer 03 [Return] Enter 2 digit years at present address 05 [Return] APPLICANT NUMBER 376 ACCEPTED Enter 3 digit application number 999 [Return] All applicants processed |
Calling a program or routine that is written in C allows you to take advantage of features of that language. Example 12-17 features a C routine that can be called from a COBOL program.
Example 12-17 has two global external variables, __Argc and **__Argv. Note that **__Argv[] has an extra level of indirection; it is a pointer to a pointer to an array.
Example 12-17 C Routine to Be Called from a COBOL Program |
---|
/* crtn - c function to test use of argc and argv in c routines * called from HP COBOL */ #include "cobfunc.h" #include <stdio.h> extern int _ _Argc; extern char **_ _Argv[]; #define argc _ _Argc #define argv (*_ _Argv) void crtn() { int i; i = 0; for (i = 0; i < argc; i++) { printf("argv[%d] = %s\n", i, argv[i]); } } |
Example 12-18 is a representation of how you can call a C program from your HP COBOL application. In this case, the C routine crtn (in Example 12-17) is called.
Example 12-18 Calling a C Program from a COBOL Program |
---|
IDENTIFICATION DIVISION. PROGRAM-ID. CTEST. DATA DIVISION. WORKING-STORAGE SECTION. . . . PROCEDURE DIVISION. MAIN SECTION. A001-MAIN. . . . CALL "crtn". EXIT PROGRAM. END PROGRAM CTEST. |
For information on handling LIB$INITIALIZE when calling a C program,
see Appendix B.
12.8 Special Considerations for Interprogram Communication
Certain situations require special consideration when your programs
will communicate with other programs.
12.8.1 CALL and CANCEL Arguments
The CALL verb with a data item and the CANCEL verb with either a literal or a data item are implemented by a Run-Time Library routine that finds the appropriate program.
On Tru64 UNIX, these language features are implemented using nlist . Because of this implementation, the following items will not work on stripped images (for additional information on the strip command, refer to strip(1)):
On OpenVMS, these features are implemented by depositing
information in compiler generated psects. <>
12.8.2 Calling OpenVMS Alpha and I64 Shareable Images (OpenVMS)
When calling a subprogram installed as a shareable image, the program
name specified in the CALL statement can be either a literal or a
data-name. The same is true for the CANCEL verb. For more information
on shareable images refer to HP COBOL online help file and the
OpenVMS Linker Utility Manual. <>
12.8.3 Calling Tru64 UNIX Shareable Objects (Tru64 UNIX)
When you call a subprogram contained in a shared object, the program
name specified in the CALL statement must be a literal. The CANCEL verb
cannot be applied to programs in shared objects. For more information
on shared objects, refer to the Tru64 UNIX programming documentation.
12.8.4 Case Sensitivity on Tru64 UNIX
One difference between Tru64 UNIX and OpenVMS Alpha and I64 is
case sensitivity. From program code creation, to your application
internal operations, you must maintain an awareness of this issue when
you consider porting COBOL source code between the platforms.
12.8.4.1 Linker Case Sensitivity
The linker on Tru64 UNIX is case sensitive. "JOB1" is not the same routine as "job1". However, COBOL is defined as a case insensitive language: CALL "job1" should invoke a routine whose PROGRAM-ID is JOB1. This is not true of case sensitive languages, such as C. The names option flag increases the flexibility of the HP COBOL compiler in communicating with case sensitive languages.
The names option has three values:
The names option flag does not apply to the CANCEL verb or to the CALL verb used with a data item. These language features are meaningful only when both the calling program and the called program are HP COBOL programs.
Previous | Next | Contents | Index |