Как преобразовать десятичные значения в строки в COBOL - PullRequest
2 голосов
/ 01 декабря 2011

Дан следующий код:

VAR X  PIC S9(7)V9(2).
VAR Y PIC X(15)

Следующий код с ошибкой компиляции.

MOVE  X TO Y.    * compile error.

сообщение об ошибке выглядит примерно так: «невозможно переместить нецелые числа в алфавитно-цифровую переменную»

есть ли способ исправить эту проблему, не используя другие переменные (например, display vars)?

Ответы [ 3 ]

9 голосов
/ 01 декабря 2011

Исправление иногда включает в себя 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 содержит что-то, что читается и имеет смысл для нормального человеческого глаза.

1 голос
/ 01 декабря 2011

В зависимости от того, что вы хотите, чтобы Y содержал, нет.

01  VARS.
    05  X PIC S9(7)V9(2).
    05  Y REDEFINES X PIC X(9).
    05  Z PIC -9(7).99.
    05  Q PIC X(11).

    MOVE X TO Z
    MOVE Z TO Q
    DISPLAY Y
    DISPLAY Q

Попробуйте и посмотрите, что дает ответ, который вы хотите.

Предостережение, это было просто от руки, у меня естьне пытался его скомпилировать.

0 голосов
/ 25 января 2013
IDENTIFICATION DIVISION. 
PROGRAM-ID. EXAMPLE. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 
01  Y PIC X(15). 
01  T REDEFINES Y PIC -(5)9(7).99.
01  U REDEFINES Y PIC -9(7).99B(4).
01  X PIC S9(7)V9(2). 
PROCEDURE DIVISION. 
    MOVE -1234567.89 TO X 
    MOVE X TO T 
    DISPLAY 'X: >' X '< Y: >' Y '<'
    MOVE X TO U 
    DISPLAY 'X: >' X '< Y: >' Y '<'
    GOBACK 
    . 

T - выравнивание по правому краю, U - выравнивание по левому краю. Поскольку оба REDEFINES занимают полные 15 байтов, нет необходимости принимать во внимание какое-либо значение в Y до перемещения M к T или U.

Вывод:

X: >12345678R< Y: >    -1234567.89<
X: >12345678R< Y: >-1234567.89    <
...