已请求可执行程序,但 PROCEDURE/ENTRY 具有 USING 子句
Executable program requested but PROCEDURE/ENTRY has USING clause
有谁知道是什么导致了这个编译错误?我正在尝试使用 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.
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.
首先,不需要usage
和is
这两个词。我将 USAGE 用于 INDEX 和 POINTER。 computational
不需要全拼,COMP
就够了,包括COMP-3
.
77 级已经过了保质期,在 LINKAGE SECTION
中很少见。全部改成01级不影响程序运行
数据名称很糟糕,几乎没有意义。我们有 30 个角色可以玩,所以让它们有意义。我、D 和 M 是什么?你只能通过详细查看代码来判断。
这似乎是整个 WORKING-STORAGE SECTION
(LINKAGE SECTION
不是其中的一部分,它们都是 DATA DIVISION
的一部分)。这将表明该程序在 PROCEDURE DIVISION 中没有太多内容,但也表明其中包含很多文字。这不好。使程序更难维护。
该程序似乎与罗马数字有关。为了突出数据名称可能引起的混淆,数字 D、I 和 M 分别与数据名称 D、I 和 M 无关,但如果你更不幸,一个或多个数据名称将与具有单字符名称但不同的数据名称相关联。
没有更多的代码就不能说更多。如果您想对其进行审查,Stack Exchange 有一个方面,Code Review,正是为了这个目的。工作代码,如何做得更好...
根据您现在显示的代码,您需要将其编译为可加载模块,因此请使用 -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 上使用 USING 或 ENTRY 语句,那么如果程序被编译为可执行文件并带有 -x 开关,您就不能指望该程序能够运行。它必须被编译为可加载模块,带有 -m.
然而,正如 cschneid 指出的那样,在 IBM 大型机 COBOL 中,在执行的第一个程序中使用 USING 是常见且有效的,因为这是从 JCL 中获取参数值的方式 运行 程序。
如果是这种情况,您将需要更改代码,以允许来自命令行的参数。
那么,你有哪些?应该使用 -m 编译的 CALLed 程序,还是需要操作系统参数的程序?
无论您是否升级,您都应该为自己准备一份 Gary Cutler 的编程指南,用于您将要使用的 OpenCOBOL/GnuCOBOL。使用 gary cutler cobol programming guide
进行搜索将使您找到正确的搜索结果。
有谁知道是什么导致了这个编译错误?我正在尝试使用 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.
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.
首先,不需要usage
和is
这两个词。我将 USAGE 用于 INDEX 和 POINTER。 computational
不需要全拼,COMP
就够了,包括COMP-3
.
77 级已经过了保质期,在 LINKAGE SECTION
中很少见。全部改成01级不影响程序运行
数据名称很糟糕,几乎没有意义。我们有 30 个角色可以玩,所以让它们有意义。我、D 和 M 是什么?你只能通过详细查看代码来判断。
这似乎是整个 WORKING-STORAGE SECTION
(LINKAGE SECTION
不是其中的一部分,它们都是 DATA DIVISION
的一部分)。这将表明该程序在 PROCEDURE DIVISION 中没有太多内容,但也表明其中包含很多文字。这不好。使程序更难维护。
该程序似乎与罗马数字有关。为了突出数据名称可能引起的混淆,数字 D、I 和 M 分别与数据名称 D、I 和 M 无关,但如果你更不幸,一个或多个数据名称将与具有单字符名称但不同的数据名称相关联。
没有更多的代码就不能说更多。如果您想对其进行审查,Stack Exchange 有一个方面,Code Review,正是为了这个目的。工作代码,如何做得更好...
根据您现在显示的代码,您需要将其编译为可加载模块,因此请使用 -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 上使用 USING 或 ENTRY 语句,那么如果程序被编译为可执行文件并带有 -x 开关,您就不能指望该程序能够运行。它必须被编译为可加载模块,带有 -m.
然而,正如 cschneid 指出的那样,在 IBM 大型机 COBOL 中,在执行的第一个程序中使用 USING 是常见且有效的,因为这是从 JCL 中获取参数值的方式 运行 程序。
如果是这种情况,您将需要更改代码,以允许来自命令行的参数。
那么,你有哪些?应该使用 -m 编译的 CALLed 程序,还是需要操作系统参数的程序?
无论您是否升级,您都应该为自己准备一份 Gary Cutler 的编程指南,用于您将要使用的 OpenCOBOL/GnuCOBOL。使用 gary cutler cobol programming guide
进行搜索将使您找到正确的搜索结果。