2

有谁知道是什么导致了这个编译错误?我正在尝试使用 OpenCOBOL 编译旧的 COBOL 程序。这是我得到的错误:

Error: Executable program requested but PROCEDURE/ENTRY has USING clause

这是我的程序部门的样子:

procedure division using array-area, m, err, sum1.

这是我工作站的链接部分:

working-storage section.
77  i    picture s99 usage is computational.
77  prev picture s9(8) usage is computational.
77  d    picture s9(4) usage is computational.
01 error-mess.
    02 filler picture x(22) value ' illegal roman numeral'.
linkage section.
77  m    picture s99 usage is computational.
77  err  picture s9 usage is computational-3.
77  sum1 picture s9(8) usage is computational.
01  array-area.
    02 s picture x(1) occurs 30 times.
4

1 回答 1

3
working-storage section.
77  i    picture s99 usage is computational.
77  prev picture s9(8) usage is computational.
77  d    picture s9(4) usage is computational.
01 error-mess.
    02 filler picture x(22) value ' illegal roman numeral'.
linkage section.
77  m    picture s99 usage is computational.
77  err  picture s9 usage is computational-3.
77  sum1 picture s9(8) usage is computational.
01  array-area.
    02 s picture x(1) occurs 30 times.

首先,不需要单词usageand is。我将 USAGE 用于 INDEX 和 POINTER。computational不需要完整拼写,COMP就足够了,并且包括COMP-3.

Level-77 已经过了保质期,在LINKAGE SECTION. 全部改成01级不影响程序运行。

数据名称很糟糕,几乎没有意义。我们有 30 个角色可以玩,所以让它们有意义。什么是 I、D 和 M?您只能通过详细查看代码来判断。

这似乎是全部WORKING-STORAGE SECTIONLINKAGE SECTION不是其中的一部分,它们都是 的一部分DATA DIVISION)。这将表明该程序在 PROCEDURE DIVISION 中没有太多内容,但也表明确实包含很多文字。哪个不好。使程序更难维护。

该程序似乎与罗马数字有关。为了突出数据名称可能引起的混乱,数字 D、I 和 M 分别与数据名称 D、I 和 M 无关,但如果你更不幸,一个或多个数据名称将与具有单字符名称但不同的数据名称相关联。

没有更多的代码不能说更多。如果您想对其进行审查,Stack Exchange 有一个方面,代码审查,正是为了这个目的。工作代码,如何做得更好......


从您现在显示的代码中,您需要将其编译为可加载模块,因此请使用 -m 开关而不是 -x:

cobx -m ..otherswitches.. yourprogramname

z/OS 调用的程序在 PROCEDURE DIVISION 的 USING 上只有一个项目,它是一个组项目,由一个两字节的二进制文件组成(可能是 COMP,可能是 COMP-4,COMP -5 或 BINARY,没关系)和最多 100 个字节的 PIC X,可能用 OCCURS 定义,但很可能不是。名称中可能包含 PARM 一词。

您显示的代码看起来不像传统的 z/OS COBOL 程序:-)


首先,您可能需要考虑升级到 GnuCOBOL,即 OpenCOBOL 的新名称。这里有一个讨论区,https://sourceforge.net/p/open-cobol/discussion/?source=navbar,可以解决任何大小问题。

GnuCOBOL 知道,如果您在 PROCEDURE DIVISION 或 ENTRY 语句上使用了 USING,那么如果使用 -x 开关将程序编译为可执行文件,您就不能期望该程序能够工作。它必须用-m 编译为可加载模块。

但是,正如 cschneid 所指出的,在 IBM Mainframe COBOL 中,在执行的第一个程序中使用 USING 是常见且有效的,因为这是从运行程序的 JCL 获取参数值的方式。

如果是这种情况,您将需要更改代码,以允许来自命令行的参数。

那么,你有哪个?应该使用 -m 编译的 CALLed 程序,还是需要操作系统提供参数的程序?

无论您是否升级,您都应该为自己准备一份 Gary Cutler 的 OpenCOBOL/GnuCOBOL 编程指南,供您使用。搜索gary cutler cobol programming guide将允许您找到正确的。

于 2015-03-14T21:02:45.773 回答