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
为什么差异以及我该怎么做才能得到一个数字数组,这些数字也可以被视为一串数字?
答案 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。
我无法摆脱警告。