Пахнет логической ошибкой где-то в программе. Тяжело сказать
что это может быть Но у меня есть несколько идей ...
Возможные причины бесконечного цикла:
- Не удалось проверить условия конца файла
- Не реагирует на конец файла должным образом
- Тестирование конца файла, но при условии, что все остальные условия являются «успешными», читает
Конец файла иногда определяется путем проверки статуса файла после каждого
Операция ввода / вывода. Статус файла - это необязательный двухсимвольный элемент данных, связанный с файлом.
чтения / записи. Указано
в пункте FILE-CONTROL вашей программы. Например:
SELECT file-name ASSIGN TO dd-name FILE STATUS fstatus
где: file-name
- это имя, на которое вы ссылаетесь в инструкциях OPEN / READ / WRITE / CLOSE. dd-name
это имя внешнего файла (DDNAME из вашего JCL). fstatus
объявлен двухбуквенный элемент данных
под РАБОЧЕГО ХРАНЕНИЯ.
Состояние файла устанавливается при каждой операции ввода-вывода файла. Например:
READ file-name
устанавливает fstatus
в конец файла, если больше нет записей для чтения. Обратите внимание, что статус файла
На переменную READ
фактически не ссылаются, но она установлена.
Значения статуса файла состоят из двух символов и определены в стандарте ISO COBOL, они должны
быть одинаковым для всех реализаций COBOL. Исключением являются значения статуса файла, где первый
символ '9', это зависит от реализации. Вот ссылка на IBM Enterprise
Значения статуса файла COBOL
Значение для конца файла: «10», которое должно быть одинаковым для всех реализаций COBOL.
Я предполагаю, что ваша программа имеет статус файла для каждого из входных файлов, но не проверяет его или не реагирует на него
соответственно. Например, ваша программа может проверять только конец файла, но не другие условия:
IF fstatus = '10'
PERFORM END-OF-FILE-LOGIC
ELSE
PERFORM NORMAL-LOGIC
END-IF
Проблема этого подхода заключается в том, что он обрабатывает нормальные возвраты (fstatus = '00') и все ошибки, не связанные с концом файла
условия, как если бы чтение было успешным. Лучше иметь что-то вроде:
EVALUATE fstatus
WHEN '10'
PERFORM END-OF-FILE-LOGIC
WHEN '00'
PERFORM NORMAL-LOGIC
WHEN OTHER
PERFORM UNEXPECTED-ERROR
END-EVALUATE
Существует императивная форма оператора READ
, которая определяет, что делать, когда конец файла
достигнуто Это выглядит примерно так:
READ file-name AT END PERFORM END-OF-FILE-LOGIC END-READ
Опять же, если в разделе FILE-CONTROL для file-name
указано состояние файла, а не конец файла
произошла ошибка, ваша программа будет пытаться продолжить работу с «нормальной» логикой
делает.