COBOL - 子程序

  • 简述

    Cobol 子程序是一个可以独立编译但不能独立执行的程序。有两种类型的子程序:internal subroutines喜欢Perform陈述和external像 CALL 动词这样的子程序。
  • CALL 动词

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

    称为程序约束

    以下是所谓的程序要求 -
    • Linkage section必须在被调用程序中定义。它由程序中传递的数据元素组成。数据项不应有 Value 子句。PIC 子句必须与通过调用程序传递的变量兼容。
    • Procedure division using具有从调用程序传递的变量列表,并且顺序必须与调用动词中提到的相同。
    • Exit program在被调用程序中使用语句将控制权传回。它必须是被调用程序中的最后一条语句。
    参数可以通过两种方式在程序之间传递 -
    • 引用
    • 按内容
  • 通过引用调用

    如果被调用程序中变量的值被修改,那么它们的新值将反映在调用程序中。如果BY子句未指定,则变量始终通过引用传递。

    句法

    以下是通过引用调用子程序的语法 -
    
    CALL sub-prog-name USING variable-1, variable-2.
    
    Example
    以下示例是 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.
    
    Example
    以下示例是 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
    
  • Call 类型

    有两种类型的调用 -
    • Static Call在使用 NODYNAM 编译器选项编译程序时发生。静态调用程序在编译时加载到存储中。
    • Dynamic Call当使用 DYNAM 和 NODLL 编译器选项编译程序时发生。动态调用程序在运行时加载到存储中。