Мой декрементный цикл работает, как и ожидалось, но команда MULTIPLY ведет себя странно.Он делает 1 * 6 и 6 * 5 правильно, но 30 * 4, кажется, не работает, тогда 30 * 3 делает, и, наконец, 90 * 2 снова не работает.Разве COBOL не нравится умножение на степени двух или чего-то еще?
05 Operand PIC S99 VALUE 0.
05 Product PIC S99 VALUE 1.
Когда вы умножаете 30*4
и 90*2
, значения больше, чем предложение PICTURE
, S99
.
Увеличьте размер предложения PIC
, скажем, до S999
.
Ответ на комментарии:
Технически, результат не определен [COBOL 85
], поэтому бездействие - правильный выбор.Другие реализации усекают значение, давая другой результат.
Так что это не столько язык, сколько реализация.
Язык также позволяет фразе SIZE ERROR
перехватывать усечение.ошибки.В этой ситуации результат не изменяется, но может быть выполнен дополнительный код, чтобы указать, что произошла ошибка.
При COBOL 2002
результат определяется разработчиком, если фраза ON SIZE ERROR
непроверка и проверка исключения EC-SIZE-TRUNCATION
не активны.
Цитата из стандарта 2002 года:
F.1 Существенные изменения, потенциально влияющие на существующие программы
15) Условие ошибки размера без фразы SIZE ERROR.Если возникает ошибка размера, инструкция, в которой она возникает, не содержит фразы SIZE ERROR или NOT SIZE ERROR, и не существует связанной декларации, разработчик определяет, завершен ли модуль выполнения или выполнение продолжается с неправильными значениями.
Обоснование:
В предыдущем стандарте COBOL правила ошибки размера указывали, что выполнение будет продолжаться с неопределенными значениями, но было неясно, где будет продолжаться выполнение, особенно в условных выражениях.Кроме того, продолжение выполнения с неверными результатами было неприемлемо для многих критически важных приложений, где это может привести к повреждению баз данных, некорректному продолжению выполнения программы и, возможно, множеству дополнительных ошибок.Запрещалось изменять программы для добавления ОШИБКИ НА РАЗМЕР для каждого затронутого оператора.Отвечая требованиям пользователя, несколько разработчиков прекратили выполнение программы в этой ситуации;в некоторых случаях разработчик допускал выбор завершения на основе директивы компилятора.
Количество и критичность приложений, которые прекратили работу в этой ситуации, дают веские основания для этого изменения.Ожидается, что это изменение окажет небольшое влияние на существующие программы, поскольку разработчики могут продолжить или прекратить работу в соответствии с реализацией предыдущего стандарта COBOL.