COBOL子程序调用

内部子程序
    IDENTIFICATION DIVISION.
    PROGRAM-ID. PROC-A.
    ENVIRONMENT DIVISION.
    ...
    DATA DIVISION.
    ...
    PROCEDURE DIVISION.
    ...
       IDENTIFICATION DIVISION.
       PROGRAM-ID. PROC-B.
       ENVIRONMENT DIVISION.
       ...
       DATA DIVISION.
       ...
       PROCEDURE DIVISION.
       ...
       END PROGRAM PROC-B.
       IDENTIFICATION DIVISION.
       PROGRAM-ID. PROC-C.
       ENVIRONMENT DIVISION.
       ...
       DATA DIVISION.
       ...
       PROCEDURE DIVISION.
       ...
           IDENTIFICATION DIVISION.
           PROGRAM-ID. PROC-D.
           ENVIRONMENT DIVISION.
           ...
           DATA DIVISION.
           ...
           PROCEDURE DIVISION.
           ...
           END PROGRAM PROC-D.
       END PROGRAM PROC-C.
    END PROGRAM PROC-A.
    程序A包含B,C两个子程序,其中C又包含子程序D。
    A能调用B,C。C能调用D。B不能调用C,A不能调用D。
    如果C声明为公用的,则B可以调用C,语法为:
    PROGRAM-ID. PROC-C IS COMMON PROGRAM.

    当前函数中定义的变量都只是对当前函数有效。可以用GLOBAL声明为对所有函数有效。
    01 DATA-NAME IS GOLBAL ...
    文件也有此声明:FD FILE-NAME IS GOLBAL ...

    如果调用的不是本程序中的文件或变量,则可以用EXTERNAL声明。
    FD FILE-NAME IS EXTERNAL.../01 DATA-NAME IS EXTERNAL...

    CALL PROC VAR1 [ON EXCEPTION CODE1] [NOT ON EXCEPTION CODE2] END-CALL.
    如果找不到PROC程序名,执行CODE1(如果有此声明),找到将参数VAR1传递给PROC,并执行。PROC返回时执行CODE2(如果有此声明)。
    参数应该在文件,工作存储或连接节中定义,应为01层数据项,77层数据项或基本数据项。
    子程序要返回调用程序,执行EXIT PROGRAM

    传递参数有3步:
    首先在调用程序的CALL语句列出要传递的参数。
    CALL PROC VAR1 .
    然后在被调用程序的过程部标题,使用USING短语列出相应的参数。
    PROCEDURE DIVISION USING VAR1.
    最后在被调用程序的连接节(LINKAGE SECTION)提供参数的存储空间。
    LINKAGE SECTION.
    01 VAR1 PIC XX.

    参数传递有2中方式:
    BY CONTENT    传递的参数值只在被调用函数中被改变,调用函数中的值不变。
    BY REFERENCE. 传递的参数值在被调用函数中被改变,调用函数中的值也改变。
    CALL PROC VAR1 BY CONTENT/REFERENCE.

    再次调用子程序,子程序处于上次退出的状态(除了连接节中的数据),打开的文件依然打开。
    可以用INITIAL声明函数被调用时处于初始状态。
    PROGRAM-ID. PROC-C IS INITIAL PROGRAM.

    如果不想每次执行都初始化,只在需要的时候初始化,可以用CANCEL PROC.初始化PROC程序,但不执行PROC。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值