Cobol 已请求可执行程序,但过程/条目具有USING子句

Cobol 已请求可执行程序,但过程/条目具有USING子句,cobol,gnucobol,Cobol,Gnucobol,有人知道是什么导致了这个编译错误吗?我正在尝试使用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 pictur

有人知道是什么导致了这个编译错误吗?我正在尝试使用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.
首先,不需要使用
用法
。我使用索引和指针的用法<代码>计算性不需要完整拼写,
COMP
就足够了,包括
COMP-3

77级已经过了销售日期,在
链接部分
中很少看到它们。如果将它们全部更改为01级别,则不会影响程序的运行

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

这似乎是整个
工作存储部分
(链接部分不是其中的一部分,它们都是
数据部分
)的一部分。这将表明程序没有太多的过程划分,但也表明所包含的内容涉及大量文本。这很糟糕。使程序更难维护

这个程序似乎与罗马数字有关。为了突出显示数据名可能导致的混淆,数字D、I和M分别与数据名D、I和M无关,但如果您更不走运,则一个或多个数据名将与具有单个字符名但不同的数据名相关联

没有更多的代码就说不出更多。如果您想查看它,堆栈交换有一个侧面,代码检查,正是为了这个目的。工作代码,如何做得更好


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

cobx -m ..otherswitches.. yourprogramname
一个被z/OS调用的程序在使用过程划分时只有一个项,它将是一个组项,由一个两字节的二进制文件(可能是COMP,可能是COMP-4,COMP-5或二进制文件,这无关紧要)和一个最多100字节的PICX组成,可能是用一个OCCURS定义的,但很可能不是。也许它的名字里会有PARM这个词

您所展示的代码看起来不像是一个遗留的z/OSCOBOL程序:-)


首先,您可能需要考虑升级到GnUCOBOL,这是OpenCOBOL的新名称。这里有一个讨论区,可以讨论任何大小的问题

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

然而,正如cschneid所指出的,在IBM大型机COBOLs中,在第一个程序中执行USING是常见且有效的,因为这是从运行该程序的JCL获取参数值的方法

如果是这种情况,则需要更改代码,以允许从命令行输入参数

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


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

我不太确定我有哪一个。我已经复制了我的过程部分上面的样子。刚刚看到你的答案,我没有写代码,我应该重新设计它到现代版本的Cobol。有没有不使用-m的方法来实现这一点?比如说,为了避免这种情况,我需要在代码中做什么修改?@Tony,这是一个子程序。它不能作为一个独立的程序工作。它将被另一个程序调用。操作系统启动的第一个程序将使用
-x
编译(或默认使用-x),所有调用的程序都必须使用
-m
编译,否则无法运行。这段代码是迄今为止我所见过的最可怕、最糟糕的大型机代码。你是粘贴还是重新打字?在“遗留”(旧)程序中很少看到小写。我将其全部转换为小写。你认为还有什么不好的?我可以试着改变我的答案,进一步更新。
cobx -m ..otherswitches.. yourprogramname