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

时间:2015-11-08 14:48:09

标签: cobol microfocus gnucobol

       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

为什么差异以及我该怎么做才能得到一个数字数组,这些数字也可以被视为一串数字?

2 个答案:

答案 0 :(得分:4)

它是Micro Focus Visual COBOL 2.3中的COBOL语言扩展,或者它是一个bug。

确实,找到一些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可以从属于其数据的项目   description条目包含OCCURS子句。在这种情况下,   REDEFINES子句中对data-name-2的引用不得   下标。无论是原始定义还是重新定义   应包括一个依赖于事件的表。

与标准的重新定义有关的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的物品重新定义(或做很多有用的),所以它仍然是一个填充物。

这是为了'#34;可维护性"。下一个人永远不会改变OCCURS的结构,因此在做出改变时永远不必担心。使用短手结构,未来的变化可能需要重组,然后必须考虑进行重组。

如果您的表格已按此方式编码,则无论如何都不会出现问题。

请参阅您关于REDEFINES的Micro Focus文档,它们通常直接指示语言扩展。如果没有可以找到的语言扩展,请提出Micro Focus的问题。他们会指出你的扩展文档,或者做一些有建设性的事情。

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

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

答案 1 :(得分: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。

我无法摆脱警告。