Переопределение массива как строки работает в MFCOBOL, но выдает предупреждение в GnuCOBOL

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

Это отлично компилируется в Micro Focus Visual COBOL 2.3 в Visual Studio 2015. Это дает ошибку в GnuCOBOL, а именно

В исходном определении не должно быть OCCURS

В чем разница и что мне делать, чтобы иметь массив цифр, который также можно рассматривать как строку цифр?


person bugmagnet    schedule 08.11.2015    source источник


Ответы (2)


Это либо расширение языка COBOL в Micro Focus Visual COBOL 2.3, либо ошибка.

Действительно, поиск некоторой документации Micro Focus показывает:

OSVS MF Описание данных для data-name-2 может содержать предложение OCCURS.

OSVS и MF указывают, к чему относится расширение языка. MF — это Micro Focus, OSVS, как я полагаю, предназначена для OS/VS COBOL на мейнфрейме IBM. Я часто использовал это, но, поскольку я не пишу код таким образом, я не могу сказать, работало ли это так. OS/VS COBOL соответствовал стандарту 1974 года.

Находя старое (1975 г.) руководство по OS/VS COBOL, вот определение REDEFINES:

номер уровня имя-данных-l ПЕРЕОПРЕДЕЛЯЕТ имя-данных-2

Это также служит для цитаты Micro Focus.

Вот соответствующая часть из этого руководства OS/VS COBOL:

Запись описания данных far data-name-2 не может содержать предложение OCCURS.

Поэтому я не уверен, что OSVS в документе Micro Focus — это OS/VS COBOL. Я знаю, что значки где-то перечислены...

Из проекта Стандарта 2015 г. (получить настоящий Стандарт дорого):

Запись описания данных для data-name-2 не должна содержать предложение OCCURS. Однако имя-данных-2 может быть подчинено элементу, запись описания данных которого содержит предложение OCCURS. В этом случае ссылка на имя-данных-2 в предложении REDEFINES не должна индексироваться. Ни исходное определение, ни переопределение не должны включать таблицу, зависящую от вхождения.

Стандарт 1985 года в том, что касается ПЕРЕОПРЕДЕЛЕНИЯ СОБЫТИЙ, остается таким же.

Это должно сделать для вас:

   01  COUNTER.
       03  DIGITS1 OCCURS 40 TIMES PIC 9.

Просто используйте COUNTER вместо STRING1 (надеюсь, эти имена только для этого примера, а не настоящие).

СЧЕТЧИК — это элемент группы, который обрабатывается как буквенно-цифровой элемент с общей длиной, равной сумме длин всех его подчиненных элементов.

Вы хотите, чтобы 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, нет проблем. Если вам нужно ПЕРЕОПРЕДЕЛИТЬ ПРОИСХОДЯЩИЙ элемент, нет проблем. Вы не можете ПЕРЕОПРЕДЕЛИТЬ (или сделать много полезного) с элементом, фактически содержащим OCCURS, поэтому он остается FILLER.

Это для "ремонтопригодности". Следующему человеку никогда не придется изменять структуру OCCURS, поэтому никогда не нужно беспокоиться при внесении изменений. При сокращенной структуре будущее изменение может потребовать реорганизации, которую затем необходимо учитывать на предмет влияния.

Если бы ваша таблица была закодирована таким образом, то в любом случае не было бы проблемы.

Обратитесь к документации Micro Focus для ПЕРЕОПРЕДЕЛЕНИЙ, они обычно прямо указывают языковые расширения. Если нет языкового расширения, которое вы можете найти, обратитесь в Micro Focus. Они укажут вам на документацию по расширению или сделают с ним что-то еще конструктивное.

Компания Micro Focus использовала несколько коммерческих компиляторов для «малых систем» и предоставляет большую поддержку, позволяющую перейти от этих компиляторов к прямым компиляторам Micro Focus. Я предполагаю, что вы найдете языковое расширение, связанное с этим.

Между прочим, также нестандартно иметь возможность ПЕРЕОПРЕДЕЛЯТЬ меньший элемент как более крупный. DIGITS1 имеет длину один. Ваш элемент REDEFINES имеет длину 40. Однако Micro Focus REDEFINES позволяет вам переопределить всю длину OCCURS.

person Bill Woodger    schedule 08.11.2015

Под ошибкой вы имеете в виду предупреждение?

   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.

Я не могу избавиться от предупреждения, хотя.

person Brian Tiffin    schedule 08.11.2015
comment
Я использую последнюю версию OpenCOBOLIDE, и она не позволяет мне компилироваться, называя код ошибкой. - person bugmagnet; 09.11.2015
comment
Просто для полноты, @boost, что дает командная строка cobc? - person Brian Tiffin; 09.11.2015
comment
@Boost Только что посмотрел. Колин исправил ошибку в OpenCOBOLIDE, 8 дней назад. github.com/OpenCobolIDE/OpenCobolIDE/issues/245 - person Brian Tiffin; 09.11.2015