01 COUNTER.
03 DIGITS1 OCCURS 40 TIMES PIC 9.
03 STRING1 REDEFINES DIGITS1 pic X(40).
這編譯罰款在Visual Studio 2015年微距對焦視覺COBOL 2.3給出了GnuCOBOL錯誤警告,即重新定義數組作爲字符串MFCOBOL工作,但在GnuCOBOL
的原始定義不應該有OCCURS
爲什麼差異,我該怎麼做一個數組的數字,也可以被視爲一串數字?
01 COUNTER.
03 DIGITS1 OCCURS 40 TIMES PIC 9.
03 STRING1 REDEFINES DIGITS1 pic X(40).
這編譯罰款在Visual Studio 2015年微距對焦視覺COBOL 2.3給出了GnuCOBOL錯誤警告,即重新定義數組作爲字符串MFCOBOL工作,但在GnuCOBOL
的原始定義不應該有OCCURS
爲什麼差異,我該怎麼做一個數組的數字,也可以被視爲一串數字?
它是Micro Focus Visual COBOL 2.3中的COBOL語言擴展,或者它是一個bug。
事實上,一些定位Micro Focus公司的文件顯示:
OSVS MF的數據名稱-2數據描述可以包含一個OCCURS 條款。
OSVS和MF指示語言擴展與什麼相關。 MF是Micro Focus,我認爲OSVS適用於IBM大型機上的OS/VS COBOL。我用了很多,但因爲我沒有這樣的代碼,所以我不能說它是否這樣工作。 OS/VS COBOL符合1974標準。
定位爲OS/VS COBOL舊(1975)手冊中,這裏是REDEFINES的把定義:
電平數目的數據名-1- REDEFINES數據名稱-2
即也適用於Micro Focus報價。
下面是相關的部分從OS/VS COBOL手冊:
的數據描述項遠數據名稱-2不能包含OCCURS 條款
所以我不所以確保Micro Focus文檔中的OSVS是OS/VS COBOL。我知道圖標某處上市...
從2015年標準(它是昂貴的,以獲得實際的標準)的草稿:
數據名稱-2的數據描述項不得包含一個OCCURS 子句。但是,數據名稱2可能從屬於其數據 說明條目包含OCCURS子句的項目。在這種情況下,REDEFINES子句中對數據名稱2的引用 不應該是 的下標。原定義或重定義都不應包含依賴於發生的表。
1985年標準,因爲它涉及OCCURS的REDEFINES是相同的。
這應該爲你做:
01 COUNTER.
03 DIGITS1 OCCURS 40 TIMES PIC 9.
只需使用計數器來代替STRING1(我希望這些名稱只是在這個例子中,不以假亂真)。
COUNTER是一個組項目,它被視爲一個字母數字項目,其總長度等於其所有從屬項目的長度總和。
當你已經有一個COUNTER時,你希望STRING1是一個40字節的PIC X字段。
我總是代碼我的表是這樣的:
01 FILLER.
05 FILLER PIC something.
05 FILLER.
10 FILLER OCCURS 40 TIMES.
15 FILLER PIC something.
05 FILLER PIC something.
OK,我在概念上做到這一點。然後,對於我實際需要的OCCURS的每個級別,我給它一個名稱。如果有OCCURS結構以外的項目,我不需要,我刪除它們。
有了這個,如果你需要重新定義包含OCCURS的組,沒有問題。如果您需要重新定義OCCURing項目,則沒有問題。你不能用實際包含OCCURS的物品重新定義(或做很多有用的),所以它仍然是一個填充物。
這是爲了「可維護性」。下一個人將永遠不會改變OCCURS的結構,因此在改變時不必擔心。在短期結構中,未來的變化可能需要重組,然後必須考慮影響。
如果你的表是用這種方式編碼的,反正也不會有問題。
請查閱您的Micro Focus文檔以瞭解REDEFINES,它們通常直接在此處指示語言擴展。如果沒有您可以找到的語言擴展,請使用Micro Focus提出問題。他們會向您指出Extension的文檔,或者對其做一些建設性的建議。
Micro Focus公司已經消費了一些「小型系統」商業編譯器,並提供了大量的支持以允許從這些編譯器直接轉向Micro Focus。我的猜測是,你會發現一個語言擴展與之相關聯。
順便說一句,它也是非標準的能夠將較小的物品重新定義爲較大的物品。 DIGITS1的長度爲1。您的REDEFINES項目長度爲40.但是,Micro Focus REDEFINES允許您重新定義OCCURS的整個長度。
錯誤,你的意思是警告?
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。
雖然我無法擺脫警告。
我使用最新版本的OpenCOBOLIDE,它不會讓我編譯,調用代碼時出錯。 – bugmagnet
爲了完整性,@ boost,命令行cobc給了什麼? –
@boost剛纔看了看。 Colin在8天前修復了OpenCOBOLIDE中的錯誤。 https://github.com/OpenCobolIDE/OpenCobolIDE/issues/245 –