Как предотвратить переход программы Cobol в бесконечный цикл, если не найдено совпадений для двух плоских файлов? - PullRequest
0 голосов
/ 31 марта 2011

Программа Cobol считывает запись из первого плоского файла и сравнивает ее с первой записью во втором плоском файле. Однако, поскольку первая запись из первого плоского файла не совпадает ни с одной записью во втором плоском файле, программа Cobol заходит в бесконечный цикл. Как мне это исправить?

Ответы [ 3 ]

1 голос
/ 31 марта 2011

Пахнет логической ошибкой где-то в программе. Тяжело сказать что это может быть Но у меня есть несколько идей ...

Возможные причины бесконечного цикла:

  • Не удалось проверить условия конца файла
  • Не реагирует на конец файла должным образом
  • Тестирование конца файла, но при условии, что все остальные условия являются «успешными», читает

Конец файла иногда определяется путем проверки статуса файла после каждого Операция ввода / вывода. Статус файла - это необязательный двухсимвольный элемент данных, связанный с файлом. чтения / записи. Указано в пункте 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 указано состояние файла, а не конец файла произошла ошибка, ваша программа будет пытаться продолжить работу с «нормальной» логикой делает.

1 голос
/ 04 апреля 2011

Для типичного последовательного совпадения файлов в конце каждого цикла необходимо прочитать одну или несколько записей.

  • Если первый ключ> = второй ключ, то считывается извторой файл.
  • если второй ключ> первый ключ, а затем считать из первого файла.

Существует множество вариантов зависимости одного от n между двумя файлами.Однако вы должны прочитать что-то в конце цикла!

1 голос
/ 31 марта 2011

В конце файла последняя прочитанная запись остается в области записи.Поэтому, если вы не проверите ситуацию с окончанием файла, ваша программа не остановится сама по себе.

...