COBOL 子程序

2018-10-18 17:14 更新

COBOL子程序是可以獨立編譯但不能獨立執(zhí)行的程序。有兩種類型的子程序:內部子程序,如perform語句;和外部子程序,如CALL動詞。

Call(調用)動詞

調用動詞用于將控件從一個程序轉移到另一個程序。包含CALL動詞的程序是Calling Program(調用程序),被調用的程序被稱為Called Program(被調用程序)。調用程序的執(zhí)行將停止,直到被調用的程序完成執(zhí)行。Exit Program語句用在被調用程序中傳送回控件。

被調用程序的約束條件

以下是被調用的程序要求:

  • Linkage section(連接節(jié)):必須在被調用程序中定義。它由在程序中傳遞的數(shù)據(jù)元素組成。該數(shù)據(jù)項不應該有value子句。PIC子句必須與通過調用程序傳遞的變量兼容。

  • Procedure division using:有一個從調用程序傳遞過來的變量列表,并且該順序必須與在Call動詞中提到的相同。

  • Exit program:該語句是用在被調用程序中傳送回控件。它必須被調用程序的最后一條語句。

參數(shù)可以通過兩種方式在程序間進行傳遞:

  • 通過引用(reference)
  • 通過內容(content)

引用調用

如果被調用程序中的變量的值被修改,那么它們的新值將在調用程序中反映出來。如果未指定BY子句,則始終通過引用傳遞變量。

語法

以下是通過引用調用子程序的語法:

CALL sub-prog-name USING variable-1, variable-2.

以下示例,MAIN是調用程序,UTIL是被調用程序:

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
   CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

被調用程序

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL執(zhí)行上述COBOL程序:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=MAIN

當你編譯和執(zhí)行上面的程序,會產生以下結果:

In Called Program
Student Id : 1111
Student Name : Tim

內容調用

如果被調用程序中的變量的值被修改,那么它們的新值將不會在調用程序中反映出來。

語法

以下是通過內容調用子程序的語法:

CALL sub-prog-name USING 
BY CONTENT variable-1, BY CONTENT variable-2.

以下示例,MAIN是調用程序,UTIL是被調用程序:

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
   CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

被調用程序

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.

JCL執(zhí)行上述COBOL程序:

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C
//STEP1 EXEC PGM=MAIN

當你編譯和執(zhí)行上面的程序,會產生以下結果:

In Called Program
Student Id : 1000
Student Name : Tim

調用類型

有兩種調用類型:

    • Static Call(靜態(tài)調用):發(fā)生在使用NODYNAM編譯器選項編譯程序時。靜態(tài)調用程序在編譯時被加載到存儲中。

    • Dynamic Call(動態(tài)調用):發(fā)生在使用DYNAM和NODLL編譯器選項編譯程序時。動態(tài)調用程序在運行時被加載到存儲中。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號