Запрошена исполняемая программа, но PROCEDURE/ENTRY содержит предложение USING

Кто-нибудь знает, что вызывает эту ошибку компиляции? Я пытаюсь скомпилировать устаревшую программу COBOL с помощью OpenCOBOL. Это ошибка, которую я получаю:

Error: Executable program requested but PROCEDURE/ENTRY has USING clause

Вот так выглядит мой процедурный отдел:

procedure division using array-area, m, err, sum1.

А это раздел связи с моей рабочей станции:

working-storage section.
77  i    picture s99 usage is computational.
77  prev picture s9(8) usage is computational.
77  d    picture s9(4) usage is computational.
01 error-mess.
    02 filler picture x(22) value ' illegal roman numeral'.
linkage section.
77  m    picture s99 usage is computational.
77  err  picture s9 usage is computational-3.
77  sum1 picture s9(8) usage is computational.
01  array-area.
    02 s picture x(1) occurs 30 times.

person Benjer    schedule 14.03.2015    source источник
comment
ОК, дальнейшее обновление, чтобы ответить.   -  person Bill Woodger    schedule 15.03.2015


Ответы (1)


working-storage section.
77  i    picture s99 usage is computational.
77  prev picture s9(8) usage is computational.
77  d    picture s9(4) usage is computational.
01 error-mess.
    02 filler picture x(22) value ' illegal roman numeral'.
linkage section.
77  m    picture s99 usage is computational.
77  err  picture s9 usage is computational-3.
77  sum1 picture s9(8) usage is computational.
01  array-area.
    02 s picture x(1) occurs 30 times.

Во-первых, нет необходимости в словах usage и is. Я использую USAGE для INDEX и POINTER. computational не нужно писать полностью, достаточно COMP, включая COMP-3.

Срок годности 77-го уровня давно истек, и редко можно увидеть их в LINKAGE SECTION. На работу программы не повлияет, если вы их все поменяете на 01-уровни.

Имена данных ужасны, почти ничего не значат. У нас есть 30 персонажей для игры, поэтому сделайте их значимыми. Что такое Я, Д и М? Вы можете сказать это, только внимательно изучив код.

Кажется, это все WORKING-STORAGE SECTION (частью которого LINKAGE SECTION не является, они оба являются частью DATA DIVISION). Это указывало бы на то, что в PROCEDURE DIVISION у программы немного, но также и на то, что там много литералов. Что плохо. Усложняет поддержку программы.

Программа вроде бы как-то связана с римскими цифрами. Чтобы подчеркнуть путаницу, которую могут вызвать имена данных, цифры D, I и M не имеют ничего общего с именами данных D, I и M соответственно, но если вам не повезло, одно или несколько имен данных будет связано с именем данных с односимвольным именем, но другим.

Не могу сказать больше без дополнительного кода. Если вы хотите просмотреть его, в Stack Exchange есть раздел Code Review как раз для этой цели. Рабочий код, как сделать лучше...


Из кода, который вы сейчас показали, вам нужно скомпилировать его как загружаемый модуль, поэтому используйте ключ -m вместо -x:

cobx -m ..otherswitches.. yourprogramname

Программа, вызванная z/OS, будет иметь только один элемент USING of PROCEDURE DIVISION, и это будет групповой элемент, состоящий из двухбайтового двоичного файла (вероятно, COMP, возможно, COMP-4, COMP). -5 или BINARY, это не имеет значения) и PIC X размером до 100 байт, возможно, определяемый с помощью OCCURS, но, скорее всего, нет. Возможно, в названии было бы слово PARM.

Код, который вы показали, не очень похож на устаревшую программу z/OS COBOL :-)


Во-первых, вы можете подумать о переходе на GnuCOBOL, новое название OpenCOBOL. Здесь есть область для обсуждения, https://sourceforge.net/p/open-cobol/discussion/?source=navbar, для любой проблемы, большой или маленькой.

GnuCOBOL знает, что если у вас есть USING в операторе PROCEDURE DIVISION или ENTRY, вы не можете ожидать, что программа будет работать, если она скомпилирована как исполняемый файл с ключом -x. Он должен быть скомпилирован как загружаемый модуль с параметром -m.

Однако, как указал cschneid, в COBOL для мейнфреймов IBM обычно и допустимо выполнение USING в первой программе, поскольку это способ получить значение параметра из JCL, в котором выполняется программа.

В этом случае вам нужно будет изменить код, чтобы разрешить параметр из командной строки.

Итак, что у вас есть? Вызванная программа, которая должна быть скомпилирована с параметром -m, или программа, которая ожидает параметр от операционной системы?

Вне зависимости от того, обновляетесь вы или нет, вы должны получить копию Руководства по программированию Гэри Катлера для OpenCOBOL/GnuCOBOL, который вы будете использовать. Поиск с gary cutler cobol programming guide позволит вам найти правильный.

person Bill Woodger    schedule 14.03.2015
comment
Я не слишком уверен, какой из них у меня есть. Я скопировал, как выглядит мое подразделение процедур выше. - person Benjer; 15.03.2015
comment
Только что увидел ваш ответ, я не писал код, я должен перепроектировать его до современной версии Кобола. Есть ли способ сделать это без использования -m? Например, что мне нужно изменить в коде, чтобы избежать этого? - person Benjer; 15.03.2015
comment
@Tony Тони Это подпрограмма. Как отдельная программа работать не будет. Он будет вызван другой программой. Первую программу, запускаемую операционной системой, вы скомпилируете с помощью -x (или пусть она по умолчанию использует -x), а все CALL-программы должны быть скомпилированы с -m, иначе они не будут работать. Этот код, безусловно, самый ужасный и дрянной код мейнфрейма, который я когда-либо видел. Вы вставили или перепечатали? Редко можно увидеть строчные буквы в устаревших (старых) программах. - person Bill Woodger; 15.03.2015
comment
Я преобразовал все это в нижний регистр. Как вы думаете, что еще плохого в этом? Я мог бы изменить это - person Benjer; 15.03.2015