COBOL 子程序

2018-10-18 17:14 更新

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

Call(調(diào)用)動(dòng)詞

調(diào)用動(dòng)詞用于將控件從一個(gè)程序轉(zhuǎn)移到另一個(gè)程序。包含CALL動(dòng)詞的程序是Calling Program(調(diào)用程序),被調(diào)用的程序被稱(chēng)為Called Program(被調(diào)用程序)。調(diào)用程序的執(zhí)行將停止,直到被調(diào)用的程序完成執(zhí)行。Exit Program語(yǔ)句用在被調(diào)用程序中傳送回控件。

被調(diào)用程序的約束條件

以下是被調(diào)用的程序要求:

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

  • Procedure division using:有一個(gè)從調(diào)用程序傳遞過(guò)來(lái)的變量列表,并且該順序必須與在Call動(dòng)詞中提到的相同。

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

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

  • 通過(guò)引用(reference)
  • 通過(guò)內(nèi)容(content)

引用調(diào)用

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

語(yǔ)法

以下是通過(guò)引用調(diào)用子程序的語(yǔ)法:

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

以下示例,MAIN是調(diào)用程序,UTIL是被調(diào)用程序:

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.

被調(diào)用程序

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

當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:

In Called Program
Student Id : 1111
Student Name : Tim

內(nèi)容調(diào)用

如果被調(diào)用程序中的變量的值被修改,那么它們的新值將不會(huì)在調(diào)用程序中反映出來(lái)。

語(yǔ)法

以下是通過(guò)內(nèi)容調(diào)用子程序的語(yǔ)法:

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

以下示例,MAIN是調(diào)用程序,UTIL是被調(diào)用程序:

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.

被調(diào)用程序

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

當(dāng)你編譯和執(zhí)行上面的程序,會(huì)產(chǎn)生以下結(jié)果:

In Called Program
Student Id : 1000
Student Name : Tim

調(diào)用類(lèi)型

有兩種調(diào)用類(lèi)型:

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

    • Dynamic Call(動(dòng)態(tài)調(diào)用):發(fā)生在使用DYNAM和NODLL編譯器選項(xiàng)編譯程序時(shí)。動(dòng)態(tài)調(diào)用程序在運(yùn)行時(shí)被加載到存儲(chǔ)中。

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)