You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

关键修复点说明

  1. 程序闭合:每个PROGRAM-ID后添加END PROGRAM [程序名].,包括主程序
  2. 主程序终止:主程序用STOP RUN替代EXIT PROGRAM,明确程序结束逻辑
  3. 参数传递:子程序PROCEDURE DIVISION添加using关联LINKAGE SECTION变量,主程序用call语句传递参数
  4. 变量修正:将pic z改为pic z(10),并添加数值到编辑符变量的赋值逻辑
  5. 交互逻辑:把硬编码的move改为accept接收用户输入,添加evaluate分支调用对应子程序
  6. 异常处理:除法子程序添加除数为0的判断,避免运行时错误

内容的提问来源于stack exchange,提问作者Luka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:25:54