Как отменить переменную?

77
4

У меня есть следующая переменная Work-storage в моей программе.

01  W-WRK.
02 W-MNTH-THRSHLD PIC S9(04).

Я использую приведенную ниже функцию COMPUTE для отрицания значения W-MNTH-THRSHLD.

COMPUTE W-MNTH-THRSHLD OF W-WRK = 
W-MNTH-THRSHLD OF W-WRK * -1.

Я хочу знать, подходит ли этот подход или есть ли альтернатива для него?

спросил(а) 2021-01-19T16:12:43+03:00 6 месяцев, 2 недели назад
1
Решение
77

Во-первых, почему вы используете квалификацию (OF)? Это требуется только в том случае, если вы определили повторяющиеся имена. Зачем определять дубликаты имен в РАБОЧЕМ ХРАНЕНИИ?

Во-вторых, если вы не используете очень старый компилятор COBOL, вы должны использовать только минимальные требуемые полные остановки/периоды в разделе PROCEDURE DIVISION. То есть один, чтобы прервать ярлык paragraph/SECTION, один, чтобы прервать абзац/раздел. Один для завершения заголовка PROCEDURE DIVISION. Один для завершения программы (если полный стоп/период еще не существует. Сохранение дополнительных полных остановок/периодов вокруг затрудняет копирование кода. Поместите полный стоп/период на отдельной строке, так что ни одна строка кода не имеет одного, тогда вы не можете случайно прекратить область действия, скопировав строку кода с полной остановкой/периодом в пределах области.

Имея это в виду, ваш код будет выглядеть следующим образом:

       COMPUTE W-MNTH-THRSHLD       = W-MNTH-THRSHLD 
* -1

Умножение происходит медленнее, чем вычитание. Так как Брюс Мартин предложил:

       COMPUTE W-MNTH-THRSHLD       = 0 
- W-MNTH-THRSHLD

Я делаю это так:

       SUBTRACT W-MNTH-THRSHLD      FROM 0 
GIVING W-MNTH-THRSHLD-REV-SIGN

Мне не нравится "уничтожать" ценность только для этого. Если программа выходит из строя, я знаю, что содержится в W-MNTH-THRSHLD, плюс значащее имя для целевого поля объясняет, что делает линия.

Вы также можете использовать DIVIDE (или / в COMPUTE), но это еще медленнее, чем MULTIPLY (или *).

Также имейте в виду, что преобразования могут потребоваться, потому что вы делаете арифметику с полем ИСПОЛЬЗОВАНИЕ DISPLAY. Если вы определяете свое поле как преобразование BINARY или PACKED-DECIMAL это менее вероятно для арифметики. Вы не проиграете это, если только ваш компилятор не справится с ИСПОЛЬЗОВАНИЕМ DISPLAY в арифметике, не требуя преобразования.

Обратите внимание, что COMPUTE не является функцией. COMPUTE - это глагол, только часть языка. "Я использую COMPUTE" достаточно и даже не нужно, поскольку мы можем видеть это из кода.

ответил(а) 2021-01-19T16:12:43+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема