Удалите PERFORM PROGRAM-CONTROL.
в конце программы, и она должна выполнить то, что вы намеревались.
Как представлено в настоящий момент, оператор PERFORM PROGRAM-CONTROL
является последним оператором CLOSE-OUT-FILE.
, а не отдельной процедурой.Это устанавливает бесконечный рекурсивный цикл.
После ответа на 'n' файл закрывается, управление передается на PROGRAM-CONTROL
, файл открывается, тогда как CONT
имеет значение 'N',файл закрывается, управление передается в PROGRAM-CONTROL
, файл открывается, тогда, поскольку CONT
имеет значение 'N', управление передается в PROGRAM-CONTROL
и т. д.
Где я ошибаюсь, и может ли он работать так, как я его настроил, или вызов WRITE должен быть частью PROGRAM-CONTROL?
Выиспользовался ненужный оператор и, нет, WRITE
не не должен быть частью PROGRAM-CONTROL
.
Если это так, как я могу рекурсивно вызывать толькочасти PROMPT-USER, WRITE-RECORD и CHECK-NEXT-RECORD, чтобы он работал?
Стандартный COBOL предупреждает о рекурсивных процедурах;например, абзац рекурсии.В этом случае вам нужно удалить только один оператор.
Рекурсия была добавлена в COBOL 2002;тем не менее, рекурсия была добавлена к PROGRAM
s, помеченным как RECURSIVE
и включена для FUNCTION
s и METHOD
s, но не было сделано никаких изменений для процедур, где ее использование не определено.
ISO / IEC 1989: 2002, оператор PERFORM, 14.8.27.3 Общие правила:
11) Результаты выполнения следующей последовательности операторов PERFORM не определены, и условие исключения не заданосуществовать при выполнении последовательности:
a) оператор PERFORM выполняется и еще не завершен, затем
b) в пределах диапазона этого оператора PERFORM выполняется другой оператор PERFORM, затем
c)выполнение второго оператора PERFORM проходит через выход первого оператора PERFORM.
ПРИМЕЧАНИЕ Поскольку это не определено, пользователь должен избегать такой последовательности выполнения.В некоторых реализациях это вызывает переполнение стека, в некоторых это вызывает возврат в маловероятные места, а в других могут происходить другие действия.Поэтому результаты непредсказуемы и вряд ли будут переносимыми.