COBOL调用外部模块提示Linkage section has null address错误求助
错误原因排查
- 参数结构完全不匹配:被调用的子程序Program3Call的LINKAGE SECTION定义了长度为18位的组项
LS-STUDENT-AVERAGE-AREA(包含5个课程分+1个平均分,共6个PIC 9(3)字段),但主程序调用时仅传入了长度为3位的单字段WW-SEND-AREA,导致子程序无法匹配到LINKAGE段的全部变量地址,触发空地址报错。 - 子程序未声明入参接收:COBOL中如果子程序要使用LINKAGE SECTION定义的变量,必须在
PROCEDURE DIVISION后通过USING关键字声明接收对应入参,你当前的子程序没有该声明,所有LINKAGE段变量默认无有效地址。 - 主程序未传递完整的课程分数据:子程序计算需要5门课程的平均分作为输入,但主程序调用时没有将读取到的
COURSE-AVERAGE-1到COURSE-AVERAGE-5传入子程序,即使参数长度匹配也无法完成计算。
可行解决方案
第一步:修改被调用子程序Program3Call
在PROCEDURE DIVISION后添加USING声明,关联LINKAGE段的入参结构,同时优化执行流避免重复执行计算逻辑,修改后代码如下:
IDENTIFICATION DIVISION. PROGRAM-ID. Program3Call. DATA DIVISION. LINKAGE SECTION. 01 LS-STUDENT-AVERAGE-AREA. 05 COURSE-AVERAGE-1 PIC 9(3). 05 COURSE-AVERAGE-2 PIC 9(3). 05 COURSE-AVERAGE-3 PIC 9(3). 05 COURSE-AVERAGE-4 PIC 9(3). 05 COURSE-AVERAGE-5 PIC 9(3). 05 STUDENT-AVERAGE PIC 9(3). * 新增USING声明接收入参 PROCEDURE DIVISION USING LS-STUDENT-AVERAGE-AREA. MAIN-PROCEDURE. 100-STUDENT-AVERAGE. PERFORM 300-CALCULATE-AVERAGE-RTN. * 执行完直接返回,避免落入下一段重复执行 GOBACK. 300-CALCULATE-AVERAGE-RTN. COMPUTE STUDENT-AVERAGE ROUNDED = (COURSE-AVERAGE-1 + COURSE-AVERAGE-2 + COURSE-AVERAGE-3 + COURSE-AVERAGE-4 + COURSE-AVERAGE-5) / 5. GOBACK.
第二步:修改主程序Project2
- 替换原来的
WW-SEND-AREA,定义和子程序LINKAGE段完全匹配的参数结构:
* 替换原来的WW-SEND-AREA定义 01 WS-STUDENT-AVERAGE-AREA. 05 WS-COURSE-AVERAGE-1 PIC 9(3). 05 WS-COURSE-AVERAGE-2 PIC 9(3). 05 WS-COURSE-AVERAGE-3 PIC 9(3). 05 WS-COURSE-AVERAGE-4 PIC 9(3). 05 WS-COURSE-AVERAGE-5 PIC 9(3). 05 WS-STUDENT-AVERAGE PIC 9(3).
- 修改
300-GET-STUDENT-AVERAGE段的逻辑,先给参数结构赋值再调用子程序:
300-GET-STUDENT-AVERAGE. * 先把读取到的5门课程分赋值到参数结构 MOVE COURSE-AVERAGE-1 TO WS-COURSE-AVERAGE-1 MOVE COURSE-AVERAGE-2 TO WS-COURSE-AVERAGE-2 MOVE COURSE-AVERAGE-3 TO WS-COURSE-AVERAGE-3 MOVE COURSE-AVERAGE-4 TO WS-COURSE-AVERAGE-4 MOVE COURSE-AVERAGE-5 TO WS-COURSE-AVERAGE-5 * 传入完整的参数结构调用子程序 CALL WW-SUB-PROG USING WS-STUDENT-AVERAGE-AREA.
- 后续如果需要使用计算得到的平均分,直接取
WS-STUDENT-AVERAGE的值即可,你可以自行补充到输出报告的对应位置。
内容的提问来源于stack exchange,提问作者user16532614
相关产品推荐
相关产品推荐

