Тип данных в COBOL

Я написал следующую программу, я не понимаю, почему при компиляции программы я получаю сообщение об ошибке, говорящее, что A-COL(1,1) не является числовым значением, а отображение A-COL(1,1) дает мне 1.

   IDENTIFICATION DIVISION.
   PROGRAM-ID. TEST1.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 DIFF PIC 9(3).
       01 ARRAY.
           05 A-ROW OCCURS 99 TIMES.
               10 A-COL OCCURS 2 TIMES.
                   15 TABLE-CONTENT PIC 9(3).

   PROCEDURE DIVISION.
       MOVE 1 TO A-COL(1,1).
       MOVE 2 TO A-COL(2,1).
       DISPLAY A-COL(1,1).
       COMPUTE DIFF = A-COL(1,1) - A-COL(2,1).
       DISPLAY DIFF.
   STOP RUN.

person Louis Kuang    schedule 17.01.2016    source источник
comment
Какая строка дает вам ошибку?   -  person Dai    schedule 17.01.2016


Ответы (2)


Измените определение A-COL на

"10 A-COL PIC 9(3) OCCURS 2 TIMES."

и удалите TABLE-CONTENT.

Групповые переменные считаются буквенно-цифровыми (тип X), поэтому их нельзя использовать в вычислениях.

В качестве альтернативы вы можете сделать это - обратитесь к местоположению адреса, используя фактическое числовое поле.

PROCEDURE DIVISION.
   MOVE 1 TO TABLE-CONTENT(1,1).
   MOVE 2 TO TABLE-CONTENT(2,1).
   DISPLAY A-COL(1,1).
   COMPUTE DIFF = TABLE-CONTENT(1,1) - TABLE-CONTENT(2,1).
   DISPLAY DIFF.

Также вы можете сделать DIFF подписанным.

Дополнительная информация

A-COL(1,1) отображает «1», потому что данные хранятся как «1xx», где x = пробел. Это не числовое значение. Когда вы запускаете решения здесь, вы заметите, что в строке дисплея отображается «001».

person uncaught_exception    schedule 17.01.2016
comment
Вроде решил проблему, но знаете, почему мне не следует так писать? - person Louis Kuang; 17.01.2016
comment
Вы не можете ссылаться на элемент уровня группы в COMPUTE, потому что элементы группы считаются буквенно-цифровыми, и вы не можете выполнять арифметические операции над буквенно-цифровыми элементами. Поэтому возникает ошибка времени компиляции. - person uncaught_exception; 17.01.2016

Сохраняйте структуру РАБОЧЕГО ХРАНИЛИЩА неизменной. Однако ваши элементы данных не A-COL, а THE-CONTENT. Так что используйте THE-CONTENT, а не A-COL.

   IDENTIFICATION DIVISION.
   PROGRAM-ID. TEST1.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01  DIFF PIC S9(3).
   01  ARRAY.
       05  A-ROW 
           OCCURS 99 TIMES.
           10  A-COL 
               OCCURS 2 TIMES.
               15 TABLE-CONTENT            PIC 9(3).

   PROCEDURE DIVISION.
       MOVE 1                       TO TABLE-CONTENT ( 1 1 )
       MOVE 2                       TO TABLE-CONTENT ( 2 1 )
       DISPLAY 
               ">"
               TABLE-CONTENT ( 1 1 )
               "<"
       COMPUTE DIFF                 = TABLE-CONTENT ( 1 1 ) 
                                    - TABLE-CONTENT ( 2 1 )
       DISPLAY 
               ">"
               DIFF
               "<"
       STOP RUN
       .

Ваша структура лучше, потому что ее легче поддерживать. Если вы когда-нибудь захотите ПЕРЕОПРЕДЕЛИТЬ ТАБЛИЧНОЕ СОДЕРЖИМОЕ, ​​вы можете это сделать, не меняя структуру. Не так, если сейчас "усложнить" структуру.

Да, если вы ПЕРЕМЕЩАЕТЕ числовой литерал в элемент группы, выполняется буквенно-цифровое ПЕРЕМЕЩЕНИЕ, результатом будет ваш литерал, выровненный по левому краю и дополненный пробелом справа, или усеченный справа, или просто подходящий, в зависимости от размера вашего литерала.

Хотя концептуально у вас есть «столбцы» в вашей таблице (COBOL не имеет массивов, у него есть таблицы с OCCURS), имейте в виду, что вы не можете получить доступ к столбцу как целому. В хранилище у вас есть строка-1-столбец-1, строка-1-столбец-2, строка-2-столбец-1, строка-2-столбец-2 до строки-99-столбец-1, строка-99-столбец -2.

Любая арифметика (ADD, SUBTRACT, MULTIPLY, DIVIDE и COMPUTE) может использовать только числовые поля или литералы в качестве исходных данных. Недостаточно, чтобы поле содержало «число», оно должно быть числовым полем.

ДАВЛЕНИЕ (ДОБАВЛЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ и ДЕЛЕНИЕ) может поместить результат в нечисловое поле определенного типа, числовое редактируемое поле. Это поле с предложением PICture, содержащим числовые символы PICture для редактирования.

person Bill Woodger    schedule 17.01.2016
comment
Спасибо, теперь понял! - person Louis Kuang; 18.01.2016