COBOL - 子程式



Cobol 子程式是可以獨立編譯但不能獨立執行的程式。子程式有兩種型別:內部子程式,如執行語句,和外部子程式,如 CALL 動詞。

呼叫動詞

呼叫動詞用於將控制權從一個程式轉移到另一個程式。包含 CALL 動詞的程式稱為呼叫程式,被呼叫的程式稱為被呼叫程式。呼叫程式的執行將暫停,直到被呼叫程式完成執行。在被呼叫程式中使用 Exit Program 語句將控制權轉移回。

被呼叫程式約束

以下是被呼叫程式的要求:

  • 連線段必須在被呼叫程式中定義。它包含傳遞到程式中的資料元素。資料項不應具有 Value 子句。PIC 子句必須與透過呼叫程式傳遞的變數相容。

  • 使用過程部包含從呼叫程式傳遞的變數列表,並且順序必須與 CALL 動詞中提到的順序相同。

  • 退出程式語句用於在被呼叫程式中將控制權轉移回。它必須是被呼叫程式中的最後一條語句。

引數可以透過兩種方式在程式之間傳遞:

  • 按引用
  • 按內容

按引用呼叫

如果被呼叫程式中變數的值被修改,則它們的新值將反映在呼叫程式中。如果沒有指定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.

執行上述 COBOL 程式的JCL

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

編譯並執行上述程式後,將產生以下結果:

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.

執行上述 COBOL 程式的JCL

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

編譯並執行上述程式後,將產生以下結果:

In Called Program
Student Id : 1000
Student Name : Tim

呼叫型別

有兩種型別的呼叫:

  • 靜態呼叫發生在使用 NODYNAM 編譯器選項編譯程式時。靜態呼叫的程式在編譯時載入到儲存器中。

  • 動態呼叫發生在使用 DYNAM 和 NODLL 編譯器選項編譯程式時。動態呼叫的程式在執行時載入到儲存器中。

廣告

© . All rights reserved.