Как выполнить арифметику на предложениях X pic в COBOL - PullRequest
1 голос
/ 19 апреля 2011

Я хотел бы написать функцию на языке COBOL, которая преобразует символы из типа данных PIC X (60) в верхний регистр. Хотя я знаю один способ сделать это, я хотел бы иметь возможность вручную проходить по буквам и добавлять константу для перехода из нижнего регистра в верхний, но я не могу выполнить какую-либо арифметику для типов данных PIC X , если я не переопределю их как что-то еще, но тогда, похоже, я искажу первоначальный символ X.

Может ли кто-нибудь дать мне пример того, как, учитывая переменную PIC X, вы можете увеличивать ее на 1 букву (то есть a -> b, d -> e ... и т. Д.). Другими словами, я хотел бы иметь возможность добавить 1 к этой переменной:

     01 char-temp pic x.

Спасибо

Иван

Ответы [ 4 ]

3 голосов
/ 21 апреля 2011

Обычно это очень плохая идея - складывать регистры таким образом, это действительно работает только для 7-битного ASCII.То, что вы спрашиваете, возможно, и даже легко сделать, но я упомяну некоторые другие способы, чтобы сначала прописать ваши данные в верхнем регистре.

Самый простой способ:

Move function upper-case(my-src-field) To my-tgt-field

Очень простой способ:

Inspect my-field 
   converting 'abc...z' to 'ABC...Z'
End-Inspect

Сложный способ, добавить один к 01 чар-темп фото x:

01 my-working-storage.
  02 char-temp-area.
    03 filler    pic x.
    03 char-temp pic x.
  02 char-temp-9 redefines char-temp-area pic s9(4) comp

.

Тогда вы можете:

Move 'A' to char-temp
Add +1 to char-temp-9

И char-temp будет содержать «B».Как уже упоминали другие, Cobol нехорошо относится к однобайтовой двоичной математике, поэтому вы должны сделать так, чтобы ваш символ помещался в младший байт двоичного числа, в данном случае это двоичное двоичное число.

1 голос
/ 20 апреля 2011

Один символ обычно занимает один байт памяти. Стандартный COBOL не имеет двоичного числового типа данных в один байт (Примечание: PIC 9 USAGE DISPLAY является символьным представлением цифры, а не двоичным представлением цифры). Таким образом, выполнение двоичной арифметики для отдельных символов в COBOL не сработает для вас.

Даже если вы можете выполнять арифметику над символами, вы можете ошибочно предположить двоичное представление символов - буква «b» не обязательно равна двоичному представлению «a» плюс 1 (это может работать ASCII, но не для EBCDIC).

Наконец, если вы хотите заменить один символ другим, вам следует изучить оператор COBOL INSPECT. В отличие от битовой переворота, INSPECT является полностью переносимым.

1 голос
/ 20 апреля 2011

Вы можете быть непослушным и использовать переопределения, например:

      01 char-temp   pic x.
      01 char-temp9  pic 99 comp-x redefines char-temp.

      move 65 to char-temp9
      display char-temp

Или использовать ссылочную модификацию:

      01 char-temp   pic x.
      01 char-temp9  pic 99 comp-x.

      move 65 to char-temp9
      move char-temp9(1:length of char-temp9) to char-temp

      display char-temp

, и я уверен, что это тоже другие подходы ...

0 голосов
/ 13 марта 2018

Может ли кто-нибудь дать мне пример того, как, учитывая переменную PIC X, вы можете увеличьте его на 1 букву (то есть a -> b, d -> e ... и т. д.). Другими словами, Я хотел бы иметь возможность добавить 1 к этой переменной:

 01 char-temp pic x.

Для COBOL 85 могут использоваться встроенные функции CHAR и ORD.

   program-id. add1.
   data division.
   working-storage section.
   1 char-temp pic x.
   procedure division.
   begin.
       move "a" to char-temp
       display char-temp "->" with no advancing
       perform add-1-to-char
       display char-temp
       stop run
       .

   add-1-to-char.
       move function char (function ord (char-temp) + 1)
           to char-temp
       .
   end program add1.

Результат:

a->b
...