GNU Cobol 3.2.0编译报错:存在多个PROGRAM-ID但未匹配END PROGRAM
问题分析与修复方案
错误根源
编译错误multiple PROGRAM-ID's without matching END PROGRAM的核心原因是:
- GNU Cobol要求每个独立程序单元(通过
PROGRAM-ID声明的程序)必须用END PROGRAM [程序名].语句显式闭合 - 主程序
taschenrechner未添加终止语句,编译器无法识别主程序的结束点
此外代码还存在其他影响运行的问题:
- 子程序的
LINKAGE SECTION变量未正确关联主程序参数,且缺少调用逻辑 - 编辑符变量
pic z定义无效,需指定长度 - 显示语句中使用的
_str变量未赋值,无法正确输出结果
修复后的完整代码
identification division. program-id. taschenrechner. data division. working-storage section. 01 zahl_1 pic 9(10) value 0. 01 zahl_2 pic 9(10) value 0. 01 ergebnis pic 9(10) value 0. 01 rechenoperator pic 9 value 0. 01 clear_screen_counter pic 9(10) value 0. * 修正编辑符变量定义,添加长度 01 zahl_1_str pic z(10) value spaces. 01 zahl_2_str pic z(10) value spaces. 01 ergebnis_str pic z(10) value spaces. procedure division. display 'Taschenrechner in COBOL.'. display ' '. display 'Bitte wählen Sie einer der folgenden Optionen aus:'. display ' '. display 'Tippen Sie 1 für Addition'. display 'Tippen Sie 2 für Subtraktion'. display 'Tippen Sie 3 für Multiplikation'. display 'Tippen Sie 4 für Division'. display ' '. accept rechenoperator. display 'Geben Sie die erste Zahl ein:'. accept zahl_1. move zahl_1 to zahl_1_str. display 'Geben Sie die zweite Zahl ein:'. accept zahl_2. move zahl_2 to zahl_2_str. * 根据选择调用对应子程序 evaluate rechenoperator when 1 call 'addition' using zahl_1, zahl_2, ergebnis, zahl_1_str, zahl_2_str, ergebnis_str when 2 call 'subtraktion' using zahl_1, zahl_2, ergebnis, zahl_1_str, zahl_2_str, ergebnis_str when 3 call 'multiplikation' using zahl_1, zahl_2, ergebnis, zahl_1_str, zahl_2_str, ergebnis_str when 4 call 'division' using zahl_1, zahl_2, ergebnis, zahl_1_str, zahl_2_str, ergebnis_str when other display 'Ungültige Auswahl!' end-evaluate. stop run. END PROGRAM taschenrechner. identification division. program-id. addition. data division. linkage section. 01 l_zahl_1 pic 9(10). 01 l_zahl_2 pic 9(10). 01 l_ergebnis pic 9(10). 01 l_zahl_1_str pic z(10). 01 l_zahl_2_str pic z(10). 01 l_ergebnis_str pic z(10). procedure division using l_zahl_1, l_zahl_2, l_ergebnis, l_zahl_1_str, l_zahl_2_str, l_ergebnis_str. add l_zahl_1 to l_zahl_2 giving l_ergebnis. move l_ergebnis to l_ergebnis_str. display '----------------------------------------------------------------------------------------------' display 'Das Ergebnis der Addition zwischen ' l_zahl_1_str ' und ' l_zahl_2_str ' lautet: ' l_ergebnis_str. display '----------------------------------------------------------------------------------------------' exit program. END PROGRAM addition. identification division. program-id. subtraktion. data division. linkage section. 01 l_zahl_1 pic 9(10). 01 l_zahl_2 pic 9(10). 01 l_ergebnis pic 9(10). 01 l_zahl_1_str pic z(10). 01 l_zahl_2_str pic z(10). 01 l_ergebnis_str pic z(10). procedure division using l_zahl_1, l_zahl_2, l_ergebnis, l_zahl_1_str, l_zahl_2_str, l_ergebnis_str. subtract l_zahl_1 from l_zahl_2 giving l_ergebnis. move l_ergebnis to l_ergebnis_str. display '----------------------------------------------------------------------------------------------' display 'Das Ergebnis der Subtraktion zwischen ' l_zahl_1_str ' und ' l_zahl_2_str ' lautet: ' l_ergebnis_str. display '----------------------------------------------------------------------------------------------' exit program. END PROGRAM subtraktion. identification division. program-id. multiplikation. data division. linkage section. 01 l_zahl_1 pic 9(10). 01 l_zahl_2 pic 9(10). 01 l_ergebnis pic 9(10). 01 l_zahl_1_str pic z(10). 01 l_zahl_2_str pic z(10). 01 l_ergebnis_str pic z(10). procedure division using l_zahl_1, l_zahl_2, l_ergebnis, l_zahl_1_str, l_zahl_2_str, l_ergebnis_str. multiply l_zahl_1 by l_zahl_2 giving l_ergebnis. move l_ergebnis to l_ergebnis_str. display '----------------------------------------------------------------------------------------------' display 'Das Ergebnis der Multiplikation zwischen ' l_zahl_1_str ' und ' l_zahl_2_str ' lautet: ' l_ergebnis_str. display '----------------------------------------------------------------------------------------------' exit program. END PROGRAM multiplikation. identification division. program-id. division. data division. linkage section. 01 l_zahl_1 pic 9(10). 01 l_zahl_2 pic 9(10). 01 l_ergebnis pic 9(10). 01 l_zahl_1_str pic z(10). 01 l_zahl_2_str pic z(10). 01 l_ergebnis_str pic z(10). procedure division using l_zahl_1, l_zahl_2, l_ergebnis, l_zahl_1_str, l_zahl_2_str, l_ergebnis_str. * 添加除数不为0的判断 if l_zahl_2 = 0 display 'Fehler: Division durch Null ist nicht erlaubt!' else divide l_zahl_1 by l_zahl_2 giving l_ergebnis move l_ergebnis to l_ergebnis_str display '----------------------------------------------------------------------------------------------' display 'Das Ergebnis der Division zwischen ' l_zahl_1_str ' und ' l_zahl_2_str ' lautet: ' l_ergebnis_str. display '----------------------------------------------------------------------------------------------' end-if. exit program. END PROGRAM division.
关键修复点说明
- 程序闭合:每个
PROGRAM-ID后添加END PROGRAM [程序名].,包括主程序 - 主程序终止:主程序用
STOP RUN替代EXIT PROGRAM,明确程序结束逻辑 - 参数传递:子程序
PROCEDURE DIVISION添加using关联LINKAGE SECTION变量,主程序用call语句传递参数 - 变量修正:将
pic z改为pic z(10),并添加数值到编辑符变量的赋值逻辑 - 交互逻辑:把硬编码的
move改为accept接收用户输入,添加evaluate分支调用对应子程序 - 异常处理:除法子程序添加除数为0的判断,避免运行时错误
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

