📜  COBOL-子例程

📅  最后修改于: 2020-11-22 16:56:27             🧑  作者: Mango


Cobol子例程是可以独立编译但不能独立执行的程序。子例程有两种类型:内部子例程(Perform语句)和外部子例程(如CALL动词)。

呼叫动词

调用动词用于将控件从一个程序转移到另一个程序。包含CALL动词的程序是“调用程序” ,被调用的程序称为“被调用程序” 。调用程序的执行将暂停,直到被调用程序完成执行为止。在被调用程序中使用Exit Program语句将控制权转回。

称为程序约束

以下是所谓的计划要求-

  • 链接部分必须在调用的程序中定义。它由程序中传递的数据元素组成。数据项不应具有Value子句。 PIC子句必须与通过调用程序传递的变量兼容。

  • 使用“过程除法”具有从调用程序传递的变量列表,并且顺序必须与“调用”动词中提到的顺序相同。

  • 在被调用程序中使用Exit program语句将控制权转回。它必须是被调用程序中的最后一条语句。

可以通过两种方式在程序之间传递参数-

  • 引用
  • 按内容

通过参考电话

如果修改了被调用程序中的变量值,则它们的新值将反映在调用程序中。如果未指定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执行上述COBOL程序-

//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.

JCL执行上述COBOL程序-

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

当您编译并执行上述程序时,它将产生以下结果-

In Called Program
Student Id : 1000
Student Name : Tim

通话类型

呼叫有两种类型-

  • 使用NODYNAM编译器选项编译程序时,将发生静态调用。静态的被调用程序在编译时被加载到存储中。

  • 当使用DYNAM和NODLL编译器选项编译程序时,将发生动态调用。动态调用程序在运行时加载到存储中。