一步步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语句,将调用后的子程序从内存中移除掉。这样,便可使得下一次调用时该子程序为最初始的状态。
一步步Cobol 400上手自学入门教程06 - 子程序调用的更多相关文章
- 一步步Cobol 400上手自学入门教程05 - 表
在COBOL中有几类典型结构的表.这几类典型结构的表在大体上可分为下标表和索引表两大类.另外,根据表的重复次数定义又有定长表和变长表.此外,表还允许嵌套,因此还有嵌套表.这几类表均符合表的基本定义,都 ...
- 一步步Cobol 400上手自学入门教程04 - 过程部
过程部的作用:编写程序要执行的语句,是程序的核心. 结构: 基本语句 INITIALIZE 设置数据项的初始值 ACCEPT 接收从键盘或指定设备上获得输入数据. 例子: 当批处理文件读到调用ACCP ...
- 一步步Cobol 400 上手自学入门教程03 - 数据部
数据部的作用 程序中涉及到的全部数据(输入.输出.中间)都要在此定义,对它们的属性进行说明.主要描述以下属性: 数据类型(数值/字符)和存储形式(长度) 数据项之间的关系(层次和层号) 文件与记录的关 ...
- 一步步Cobol 400 上手自学入门教程02 - 程序结构
标识部的格式: 标识部(IDENTIFICATION DIVISION) 用来标识程序名称,记录程序的文档记录住处如作者和日期等. 代码范例: IDENTIFICATION DIVISION.PROG ...
- 一步步Cobol 400 上手自学入门教程01 - 基础概念
先学习基础概念 1.COBOL字符:包含: User-defined words 用户定义字符 System-names Reserved words 关键字 2.用户定义字符User-defin ...
- 【CC2530入门教程-06】CC2530的ADC工作原理与应用
第6课 CC2530的ADC工作原理与应用 广东职业技术学院 欧浩源 一.A/D转换的基本工作原理 将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是AD ...
- ExtJS入门教程06,grid分页的实现
前面两篇内容分别介绍了extjs grid的基本用法和extjs grid异步加载数据,这篇文章将介绍extjs grid的分页. 数据量大的时候我们必须用到分页,结合上一篇的异步加载数据,今天我们就 ...
- 零基础大数据入门教程:Java调用阿里云短信通道服务
这里我们使用SpringBoot 来调用阿里通信的服务. 阿里通信,双11.收到短信,日发送达6亿条.保障力度非常高. 使用的步骤: 1.1. 第一步:需要开通账户 1.2. 第二步:阅读接口文档 1 ...
- python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学
首发于:python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=431 本文 ...
随机推荐
- 35、输入框(UITextField)密码明暗文切换
- (IBAction)pwdTextSwitch:(UIButton *)sender { // 前提:在xib中设置按钮的默认与选中状态的背景图 // 切换按钮的状态 sender.selecte ...
- javascript 获取用户当前 经纬度 位置
<!DOCTYPE html> <html> <body><p>http协议支持部分浏览器</p><p>https支持所有浏览器 ...
- DDR中的一些知识点说明(ODT,ZQ校准,OCT,TDQS)
ODT ( On-DieTermination ,片内终结)ODT 也是 DDR2 相对于 DDR1 的关键技术突破,所谓的终结(端接),就是让信号被电路的终端吸 收掉,而不会在电路上形成反射, 造成 ...
- 20155205 信息安全技术第二次实验 Windows口令破解
20155205 信息安全技术第二次实验 Windows口令破解 实验原理 一.口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理员的了解,猜测其可能使用某些信息 ...
- Linux后台开发工具箱
https://files-cdn.cnblogs.com/files/aquester/Linux后台开发工具箱.pdf 目录 目录 1 1. 前言 3 2. 脚本类工具 3 2.1. sed命令- ...
- spring ioc beanfactory 关系图
spring security类关系图 mybatis-spring源码解析类关系图 Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析 转: sprin ...
- HP 集群软件 - 不能接收节点的设备查询信息:软件引起的连接失败
问题 # cmcheckconf -v -C /etc/cmcluster/cmclconfig.ascii Begin cluster verification... Checking clust ...
- 如何对CentOS FTP服务配置
根据很多人对CentOS FTP服务的不解,我觉得应该对CentOS FTP服务做出一定的解释. 1.安装 一般在CentOS上都自动安装了vsftd,若没有安装则可以使用以下步骤进行安装yum -y ...
- 去除html页面中GET《 http://localhost:8080/favicon.ico 404 (Not Found)》
html5页面中经常会遇见以下问题,总是看着碍眼,那么怎么解决呢? GET http://localhost:8080/favicon.ico 404 (Not Found) 解决的方法: <l ...
- Curl工具的使用
Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 工具下载 在官网处下载工具包:http:// ...