1
       01  COUNTER.
           03  DIGITS1 OCCURS 40 TIMES PIC 9.
           03  STRING1 REDEFINES DIGITS1 pic X(40).

这在 Visual Studio 2015 的 Micro Focus Visual COBOL 2.3 中编译得很好。它在 GnuCOBOL 中给出了一个错误,即

原始定义不应有 OCCURS

为什么会有区别,我该怎么做才能拥有一个也可以被视为数字字符串的数字数组?

4

2 回答 2

4

它要么是 Micro Focus Visual COBOL 2.3 中的 COBOL 语言扩展,要么是那里的错误。

事实上,查找一些 Micro Focus 文档可以发现:

OSVS MF data-name-2 的数据描述可以包含一个 OCCURS 子句。

OSVS 和 MF 指示语言扩展涉及的内容。MF 是 Micro Focus,我假设 OSVS 用于 IBM 大型机上的 OS/VS COBOL。我经常使用它,但由于我不那样编码,我不能说它是否像那样工作。OS/VS COBOL 符合 1974 年标准。

查找 OS/VS COBOL 的旧 (1975) 手册,这里是 REDEFINES 的定义:

级别编号 data-name-l REDEFINES data-name-2

这也适用于 Micro Focus 报价。

这是该 OS/VS COBOL 手册中的相关部分:

数据描述条目 far data-name-2 不能包含 OCCURS 子句

所以我不太确定 Micro Focus 文档中的 OSVS 是 OS/VS COBOL。我知道图标列在某处......

从 2015 年标准的草案(获得实际标准的成本很高):

data-name-2 的数据描述条目不应包含 OCCURS 子句。但是,data-name-2 可能从属于其数据描述条目包含 OCCURS 子句的项目。在这种情况下,REDEFINES 子句中对 data-name-2 的引用不应下标。原始定义和重新定义都不应包括一个发生依赖表。

与 OCCURS 的重定义相关的 1985 年标准是相同的。

这应该为你做:

   01  COUNTER.
       03  DIGITS1 OCCURS 40 TIMES PIC 9.

只需使用 COUNTER 而不是 STRING1 (我希望这些名称仅用于此示例,而不是真实名称)。

COUNTER 是一个组项,它被视为一个字母数字项,其总长度等于其所有下级项的长度之和。

您希望 STRING1 成为 40 字节的 PIC X 字段,而您已经有一个:COUNTER。

我总是这样编码我的表格:

   01  FILLER.
       05  FILLER                            PIC something.
       05  FILLER.
           10  FILLER OCCURS 40 TIMES.
                15  FILLER                   PIC something.
       05  FILLER                            PIC something.

好的,从概念上讲,我是这样做的。然后,对于我实际需要的每个 OCCURS 级别,我给它一个名称。如果 OCCURS 结构之外有我不需要的项目,我会删除它们。

有了这个,如果你需要重新定义包含 OCCURS 的组,没问题。如果您需要重新定义 OCCUring 项目,没问题。您不能对实际包含 OCCURS 的项目重新定义(或做很多有用的事情),因此它仍然是一个 FILLER。

这是为了“可维护性”。下一个人永远不必更改 OCCURS 的结构,因此在进行更改时不必担心。使用简写结构,未来的变化可能需要重组,然后必须考虑影响。

如果您的表格是这样编码的,那么无论如何都不会有问题。

请查阅您的 Micro Focus 文档以了解 REDEFINES,它们通常直接在此处指示语言扩展。如果没有您可以找到的语言扩展,请向 Micro Focus 提出问题。他们会将您指向扩展的文档,或者用它做一些其他建设性的事情。

Micro Focus 该公司已经使用了一些“小型系统”商业编译器,并提供了大量支持以允许从这些编译器迁移到直接的 Micro Focus 编译器。我的猜测是你会发现一个与之相关的语言扩展。

顺便说一句,能够将较小的项目重新定义为较大的项目也是非标准的。DIGITS1 的长度为 1。您的 REDEFINES 项目长度为 40。但是,Micro Focus REDEFINES 允许您重新定义 OCCURS 的整个长度。

于 2015-11-08T16:24:44.230 回答
2

错误是指警告吗?

   identification division.
   program-id. redef.

   data division.
   working-storage section.
   01  COUNTER.
       03  DIGITS1 OCCURS 40 TIMES PIC 9.
       03  STRING1 REDEFINES DIGITS1 pic X(40).

   procedure division.
   move 1 to DIGITS1(2)
   display ":" STRING1 ":"
   goback.
   end program redef.

prompt$ cobc -xj redef.cob
redef.cob: 8: Warning: The original definition 'DIGITS1' should not have  OCCURS
:0100000000000000000000000000000000000000:
prompt$ cobc --version
cobc (GNU Cobol) 2.0.0
Copyright (C) 2001,2002,2003,2004,2005,2006,2007 Keisuke Nishida
Copyright (C) 2006-2012 Roger While
Copyright (C) 2009,2010,2012,2014,2015 Simon Sobisch
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Built     Nov 02 2015 05:58:19
Packaged  Oct 25 2015 21:40:28 UTC
C version "4.9.2 20150212 (Red Hat 4.9.2-6)"

所以,这就是 GnuCOBOL 2.0。

prompt$ cobc -x redef.cob
redef.cob:8: Warning: The original definition 'DIGITS1' should not have OCCURS
prompt$ cobc --version
cobc (GNU Cobol) 1.1.0
 ...
prompt$ ./redef 
:0100000000000000000000000000000000000000:

看起来它也适用于 1.1。

我无法摆脱警告。

于 2015-11-08T18:57:24.240 回答