Исправление иногда включает в себя REDEFINES, как в:
01.
05 Y PIC X(15).
05 X REDEFINES Y PIC S9(7)V9(2).
Обратите внимание, что X
занимает меньше места, чем Y
, поэтому X
может REDEFINE Y
, но не наоборот. Поскольку X
и Y
теперь занимают одно и то же физическое хранилище, MOVE
можно отбросить, как показано в следующей программе, и выходные данные показывают:
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Y PIC X(15).
01 X REDEFINES Y PIC S9(7)V9(2).
PROCEDURE DIVISION.
MOVE -1234567.89 TO X
DISPLAY 'X: >' X '< Y: >' Y '<'
.
Выход:
X: >12345678R< Y: >12345678R <
Как вы можете быстро увидеть, результат, вероятно, не тот, на который вы рассчитывали, поскольку Y
не содержит удобочитаемого отформатированного числа (то есть, одного с начальным знаком и десятичной точкой).
Так что мой вам совет: не пытайтесь согнуть КОБОЛ во что-то, чем оно не является. Используйте язык так, как это было задумано. Что вам, вероятно, нужно сделать, это что-то вроде:
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Y PIC X(15).
01 X PIC S9(7)V9(2).
01 T PIC -9(7).99.
PROCEDURE DIVISION.
MOVE -1234567.89 TO X
MOVE X TO T
MOVE T TO Y
DISPLAY 'X: >' X '< Y: >' Y '<'
GOBACK
.
Какие выходы:
X: >12345678R< Y: >-1234567.89 <
Да, вышеприведенная программа использует дополнительную переменную в середине для преобразования числового формата в формат отображения, но именно так был разработан язык. Длинный, но очень прямолинейный. В конце упражнения переменная Y
содержит что-то, что читается и имеет смысл для нормального человеческого глаза.