将数组重新定义为字符串在MFCOBOL中起作用,但在GnuCOBOL中发出警告

将数组重新定义为字符串在MFCOBOL中起作用,但在GnuCOBOL中发出警告,cobol,microfocus,gnucobol,Cobol,Microfocus,Gnucobol,这在Visual Studio 2015的Micro Focus Visual COBOL 2.3中编译得很好。它在GnuCOBOL中给出了一个错误,即 最初的定义不应该出现 为什么会有差异?我该怎么做才能使一个数字数组也可以被看作一个数字字符串?它可能是Micro Focus Visual COBOL 2.3中的COBOL语言扩展,也可能是一个bug 事实上,找到一些微焦点文档可以揭示: OSVS MF data-name-2的数据描述可以包含 条款 OSV和MF表示语言扩展与什么相关。MF是

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

最初的定义不应该出现


为什么会有差异?我该怎么做才能使一个数字数组也可以被看作一个数字字符串?

它可能是Micro Focus Visual COBOL 2.3中的COBOL语言扩展,也可能是一个bug

事实上,找到一些微焦点文档可以揭示:

OSVS MF data-name-2的数据描述可以包含 条款

OSV和MF表示语言扩展与什么相关。MF是Micro Focus,我假设OSV是针对IBM大型机上的OS/VS COBOL。我经常使用它,但因为我不这样编码,所以我不能说它是否像那样工作。OS/VS COBOL符合1974年的标准

查找旧的(1975年)OS/VS COBOL手册,以下是重新定义的定义:

级别编号data-name-l重新定义data-name-2

这也适用于Micro Focus的报价

以下是该OS/VS COBOL手册的相关部分:

数据描述条目far data-name-2不能包含错误 条款

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

根据2015年标准草案(获取实际标准的成本很高):

data-name-2的数据描述条目不应包含 条款但是,data-name-2可能从属于其数据 描述条目包含一个OCCURS子句。在这种情况下 不得在重新定义条款中引用data-name-2 订阅。既不是最初的定义,也不是重新定义 应包括一个表

1985年的标准与标准的重新定义是相同的

这应该对您有帮助:

       01  COUNTER.
           03  DIGITS1 OCCURS 40 TIMES PIC 9.
           03  STRING1 REDEFINES DIGITS1 pic X(40).
只需使用COUNTER而不是STRING1(我希望这些名称仅用于此示例,而不是真正的名称)

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

当您已经有一个:计数器时,您希望STRING1是一个40字节的PICX字段

我总是这样编码我的表:

   01  COUNTER.
       03  DIGITS1 OCCURS 40 TIMES PIC 9.
好的,从概念上讲我是这样做的。然后,对于我实际需要的每个级别的事件,我给它一个名称。如果在OCCURS结构之外有我不需要的项,我将删除它们

这样,如果需要重新定义包含的组,则不会出现问题。如果需要重新定义发生项,没有问题。您无法对实际包含OCCURS的项重新定义(或做很多有用的事情),因此它仍然是一个填充项

这是为了“可维护性”。下一个人将永远不必改变发生的结构,所以在做出改变时也不必担心。在短期结构下,未来的变化可能需要重组,然后必须考虑重组的影响

如果您的表以这种方式编码,那么无论如何都不会出现问题

有关重定义,请参阅Micro Focus文档,它们通常直接指示语言扩展。如果找不到语言扩展,请提出Micro Focus问题。他们会向您指出扩展的文档,或者用它做一些其他有建设性的事情

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


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

它可能是Micro Focus Visual COBOL 2.3中的COBOL语言扩展,也可能是其中的错误

事实上,找到一些微焦点文档可以揭示:

OSVS MF data-name-2的数据描述可以包含 条款

OSV和MF表示语言扩展与什么相关。MF是Micro Focus,我假设OSV是针对IBM大型机上的OS/VS COBOL。我经常使用它,但因为我不这样编码,所以我不能说它是否像那样工作。OS/VS COBOL符合1974年的标准

查找旧的(1975年)OS/VS COBOL手册,以下是重新定义的定义:

级别编号data-name-l重新定义data-name-2

这也适用于Micro Focus的报价

以下是该OS/VS COBOL手册的相关部分:

数据描述条目far data-name-2不能包含错误 条款

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

根据2015年标准草案(获取实际标准的成本很高):

data-name-2的数据描述条目不应包含 条款但是,data-name-2可能从属于其数据 描述条目包含一个OCCURS子句。在这种情况下 不得在重新定义条款中引用data-name-2 订阅。既不是最初的定义,也不是重新定义 应包括一个表

1985年的标准与标准的重新定义是相同的

这应该对您有帮助:

       01  COUNTER.
           03  DIGITS1 OCCURS 40 TIMES PIC 9.
           03  STRING1 REDEFINES DIGITS1 pic X(40).
只需使用COUNTER而不是STRING1(我希望这些名称仅用于此示例,而不是真正的名称)

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

当您已经有一个:计数器时,您希望STRING1是一个40字节的PICX字段

我总是这样编码我的表:

   01  COUNTER.
       03  DIGITS1 OCCURS 40 TIMES PIC 9.
好的,c
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)"
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: