一步步Cobol 400上手自学入门教程06 - 子程序调用

子程序的命名通常和普通程序的命名方式相同。但是需要注意的是,对于子程序而言,不可将其前缀命名为以下这几个名字。

AFB           AFH           CBC          CEE          EDC

IBM            IFY             IGY            IGZ            ILB

实际上,以上名字都属于IBM相关产品的名字。如果将子程序的前缀命名为以上名字,则在主程序中将不能对其进行调用。当在主程序中试图调用该子程序时,系统将会从IBM的库,或者编译器例程中寻求解决方案。

静态调用

下面通过具体的程序示例,以便更好地说明静态调用的特点及用法。首先,假设在静态调用中,某一主程序代码如下。

IDENTIFICATION   DIVISION.

PROGRAM-ID      STATIC-MAIN.

AUTHER           XXX.

*

ENVIRONMENT   DIVISION.

*

DATA  DIVISION.

WORKING STORAGE SECTION.

77   TEST-NUM     PIC  99.

*

PROCEDURE   DIVISION.

PERFORM  INIT-TEST-NUM.

CALL   ‘STATIC-SUB’   USING    TEST-NUM.

DISPLAY ‘TEST-NUM AFTER THE FIRST CALL: ’  TEST-NUM.

PERFORM  INIT-TEST-NUM.

CALL   ‘STATIC-ENTRY’   USING  TEST-NUM.

DISPLAY ‘TEST-NUM AFTER THE SECOND CALL: ’  TEST-NUM.

STOP RUN.

INIT-TEST-NUM.

MOVE  10  TO  TEST-NUM.

令该程序的子程序,即与之所对应的被调用程序STATIC-SUB的代码如下。

IDENTIFICATION   DIVISION.

PROGRAM-ID      STATIC-SUB.

AUTHER           XXX.

*

ENVIRONMENT   DIVISION.

*

DATA  DIVISION.

WORKING STORAGE SECTION.

01   PLUS-NUM     PIC  99   VALUE  15.

 LINKAGE SECTION.

 77   MAIN-NUM     PIC  99.

*

PROCEDURE   DIVISION   USING  MAIN-NUM.

ADD   MAIN-NUM  TO  PLUS-NUM.

MOVE  PLUS-NUM  TO  MAIN-NUM.

GOBACK.

    ENTRY  ‘STATIC-ENTRY’   USING  MAIN-NUM.

ADD   MAIN-NUM  TO  PLUS-NUM.

MOVE  PLUS-NUM  TO  MAIN-NUM.

GOBACK.

以上程序运行后,将有如下输出结果。

TEST-NUM AFTER THE FIRST CALL: 25

TEST-NUM AFTER THE SECOND CALL: 35

这是因为,在第一次调用前,子程序中的变量PLUS-NUM通过VALUE语句初始化为15。将该变量中的15和主程序中所传递的参数TEST-NUM中的10相加后,结果将为25。并且,此时子程序中的变量PLUS-NUM在相加运算结束后已由15变成了25。

当进行第二次调用时,子程序为第一次调用结束后的状态。此时,子程序中的变量PLUS-NUM为25,而并非如第一次调用前的15。虽然第二次实际上仍然是对于子程序STATIC-SUB的调用,但此时该程序中的数据已不同了。第二次调用是将PLUS-NUM中的25和TEST-NUM中的10相加,因此最终结果为35。

若要希望两次调用时子程序的状态都一致,则需要在子程序中进行相应的初始化。此处所说的初始化通常是指在该程序中的每一个入口地址后,对工作存储节中的本地数据进行初始化。进行初始化后的子程序如下。

IDENTIFICATION   DIVISION.

PROGRAM-ID      STATIC-SUB.

AUTHER           XXX.

*

ENVIRONMENT   DIVISION.

*

DATA  DIVISION.

WORKING STORAGE SECTION.

01   PLUS-NUM     PIC  99   VALUE  15.

 LINKAGE SECTION.

 77   MAIN-NUM     PIC  99.

*

PROCEDURE   DIVISION   USING  MAIN-NUM.

PERFORM  INIT-PLUS-NUM.

ADD   MAIN-NUM  TO  PLUS-NUM.

MOVE  PLUS-NUM  TO  MAIN-NUM.

GOBACK.

    ENTRY  ‘STATIC-ENTRY’   USING  MAIN-NUM.

PERFORM  INIT-PLUS-NUM.

ADD   MAIN-NUM  TO  PLUS-NUM.

MOVE  PLUS-NUM  TO  MAIN-NUM.

GOBACK.

INIT-PLUS-NUM.

MOVE  15  TO  PLUS-NUM.

仍然采用前面的主程序对以上子程序进行调用,则运行后的结果将如下。

TEST-NUM AFTER THE FIRST CALL: 25

TEST-NUM AFTER THE SECOND CALL: 25

总之,静态调用的程序每次调用前都为其上一次调用后的状态。这一点是关于静态调用最需注意的地方,一定要牢记。

动态调用

下面通过具体的程序示例,以便更好地说明动态调用的特点及用法。首先,假设在动态调用中,某一主程序代码如下。

IDENTIFICATION   DIVISION.

PROGRAM-ID      DYNAMIC-MAIN.

AUTHER           XXX.

*

ENVIRONMENT   DIVISION.

*

DATA  DIVISION.

WORKING STORAGE SECTION.

01   IDENTIF       PIC  X(10).

77   TEST-NUM     PIC  99.

*

PROCEDURE   DIVISION.

PERFORM  INIT-TEST-NUM.

MOVE   ‘DYNAMIC-SUB’  TO  IDENTIF.

CALL   IDENTIF   USING    TEST-NUM.

DISPLAY ‘TEST-NUM AFTER THE FIRST CALL: ’  TEST-NUM.

PERFORM  INIT-TEST-NUM.

CANCEL  IDENTIF.  /*此处将第一次调用后的子程序从内存中移除*/

MOVE   ‘DYNAMIC-ENTRY’ TO  IDENTIF.

CALL    IDENTIF  USING  TEST-NUM.

DISPLAY ‘TEST-NUM AFTER THE SECOND CALL: ’  TEST-NUM.

STOP RUN.

INIT-TEST-NUM.

MOVE  10  TO  TEST-NUM.

令该主程序中调用的子程序DYNAMIC-SUB的代码如下。

IDENTIFICATION   DIVISION.

PROGRAM-ID      DYNAMIC-SUB.

AUTHER           XXX.

*

ENVIRONMENT   DIVISION.

*

DATA  DIVISION.

WORKING STORAGE SECTION.

01   PLUS-NUM     PIC  99   VALUE  15.

 LINKAGE SECTION.

 77   MAIN-NUM     PIC  99.

*

PROCEDURE   DIVISION   USING  MAIN-NUM.

ADD   MAIN-NUM  TO  PLUS-NUM.

MOVE  PLUS-NUM  TO  MAIN-NUM.

GOBACK.

    ENTRY  ‘DYNAMIC-ENTRY’   USING  MAIN-NUM.

ADD   MAIN-NUM  TO  PLUS-NUM.

MOVE  PLUS-NUM  TO  MAIN-NUM.

GOBACK.

以上程序执行后,将产生如下输出结果。

TEST-NUM AFTER THE FIRST CALL: 25

TEST-NUM AFTER THE SECOND CALL: 25

可以看到,以上这两段程序实际上和静态调用中的两段示例程序是类似的。不过,此处子程序中虽然没有手工进行初始化,但每次调用时仍为最初始的状态。原因是在主程序中,第一次调用该子程序后使用了CANCEL语句将其从内存中移除掉了。这样,在第二次调用时,该子程序将被重新读入内存,其状态和第一次调用时是一样的。

最后,对本节所讲的动态调用与其所对应的静态调用总结如下。

在COBOL程序中,静态调用通常使用CALL literal语句实现。CALL literal语句实际上就是将所调用的程序名,或选择性入口地址名作为直接数进行调用。静态调用的子程序每次被调用时的状态,为其上一次调用之后的状态。

动态调用通常使用CALL identifier语句实现。CALL identifier语句实际上就是将所调用的程序名,或选择性入口地址名MOVE到变量中调用。并且,凡是使用CALL identifier语句进行的调用都为动态调用。在动态调用中,可以通过CANCEL identifier语句,将调用后的子程序从内存中移除掉。这样,便可使得下一次调用时该子程序为最初始的状态。

时间: 2024-11-10 15:50:20

一步步Cobol 400上手自学入门教程06 - 子程序调用的相关文章

一步步AS400-Cobol 上手自学入门教程01 - 基础概念(原创)

先学习基础概念 1.COBOL字符:包含: User-defined words 用户定义字符 ?System-names ?Reserved words 关键字 2.用户定义字符User-defined words:合法的定义: ? A - Z ? a - z ? 0 - 9 ? - (连字符). 3.系统名 System-names Computer-names ?Language-names ?Implementor-names: Environment-name Assignment-n

一步步AS400-Cobol 上手自学入门教程02 - 程序结构和标识部(原创)

标识部的格式: 代码范例: IDENTIFICATION DIVISION.PROGRAM-ID. IDSAMPLE.AUTHOR. PROGRAMMER NAME.INSTALLATION. COBOL DEVELOPMENT CENTER.DATE-WRITTEN. 08/27/88.DATE-COMPILED. 09/01/88 12:57:53.SECURITY. NON-CONFIDENTIAL. 环境部的格式: 代码范例 ENVIRONMENT DIVISION.CONFIGURAT

一步步AS400-Cobol 上手自学入门教程03 - 数据部(原创)

数据部的作用 程序中涉及到的全部数据(输入.输出.中间)都要在此定义,对它们的属性进行说明.主要描述以下属性: 数据类型(数值/字符)和存储形式(长度) 数据项之间的关系(层次和层号) 文件与记录的关系 数据部可以分为: 文件节(file section):用来描述程序中用到的输入输出文件及记录中各数据项的属性 工作单元节(working-storage section): 用来描述程序中用到的中间数据 联接节(linkage section):用来描述与调用程序间发生数据传递的数据项(即参数)

【CC2530入门教程-06】CC2530的ADC工作原理与应用

第6课  CC2530的ADC工作原理与应用 广东职业技术学院  欧浩源 一.A/D转换的基本工作原理 将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是ADC. ADC:数模转换器,将时间和幅值连续的模拟量转化为时间和幅值离散的数字量,A/D转换一般要经过采样.保持.量化和编码4个过程. 二.CC2530的A/D转换模块 CC2530的ADC模块支持最高14位二进制的模拟数字转换,具有12位的有效数据位,它包括一个模拟多路转换器,具有8个各自可配置的通

【ENVI入门教程06】自定义RPC文件图像正射校正、正射校正部分利用CLASSIC

文章中涉及的是5.X版本里面的正射校正方法,这里我采用ENVI classic部分进行同样效果的操作,方便5.X以下版本的参考,方法中有不正确的部分请及时联系我纠正. (一)打开和关联DEM 打开完成了第一步的SPOT4(即有了RPC info的)影像,同时打开DEM数据. 在SPOT4.tif右键EDIT HEADER,在这里选择edit attributes->associate DEM file,选择existing的文件,即这里的DEM Layer-1,点击OK即可. (二)进行正射校正

零基础大数据入门教程:Java调用阿里云短信通道服务

这里我们使用SpringBoot 来调用阿里通信的服务. 阿里通信,双11.收到短信,日发送达6亿条.保障力度非常高. 使用的步骤: 1.1. 第一步:需要开通账户 1.2. 第二步:阅读接口文档 1.2.1. 秘钥管理 1.2.2. 短信签名 1.2.3. 短信模板 1.3. SDK 这个由阿里云提供. 编译与打包. 打包到本地仓库,或者公司局域网内的私服地址. Maven打包 1.4. 第三步:创建SpringBoot工程,导入依赖 <!-- sms单独打包 --> <depende

快闪PPT 快速入门教程 脑洞大开,特效随你定 ----口袋动画PA(初学易上手001):

你没有看错--10分钟入门--30分钟精通---随心所愿--特效你定!!! 举个栗子:废话不多说直接进入教程: 直接上插件:如果慢慢学习可能立马见效效果不明显 上插件:"口袋动画PA"       链接:https://pan.baidu.com/s/1qmfi_ylNuGG5mN143KhfEQ 密码:zj1k 1.现在安装,安装完毕启动PPT,即可效果如下 看到上图恭喜你!!!! 2.使用方法: (1)第一快速套用效果快!!!别太激动,仔细琢磨 使你的快闪PPT无懈可击,带动全场气

用http.get()简单实现网络验证防止客户不给尾款_电脑计算机编程入门教程自学

首发于:用http.get()简单实现网络验证防止客户不给尾款_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=428 给软件加上网络验证是经常需要用到的实用功能,下面简单示范下怎么用http.get()简单实现网络验证,用来防止客户不给尾款等. 适用场景 1.集团公司给大量员工用的内部软件,防止外传 2.给客户定制的软件在试用版中加上网络验证,防止不给尾款 工作过程 先让用户申请帐号,管理员在后台审核添加帐号,每次登陆

哪有python开发语言入门教程免费下载?

人工智能时代,如果不想被机器人取代,最应该掌握的是编程.Python作为连续10年最受欢迎的编程语言,不但能开发Google .豆瓣等大型网站,还是人工智能领域的第一语言.那么,我猜你想问哪里有python开发语言入门教程. 千锋Python基础教程:http://pan.baidu.com/s/1qYTZiNE Python课程教学高手晋级视频总目录:http://pan.baidu.com/s/1hrXwY8k Python课程windows知识点:http://pan.baidu.com/