Как выполнить арифметику над предложениями X pic в COBOL

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

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

     01 char-temp pic x.

Спасибо,

Иван


person Ivan    schedule 19.04.2011    source источник
comment
Я настоятельно рекомендую вам изучить COBOL и перестать пытаться делать с ним что-то на C. Это не то, как работает COBOL.   -  person John Saunders    schedule 19.04.2011
comment
Почему вы предполагаете, что тип PIC закодирован таким образом, что добавления константы будет достаточно, чтобы сделать символ заглавным? Даже если это простая строка без какого-либо заголовка или трейлера, добавленного реализацией, вы все равно можете иметь дело с символами, закодированными как UTF-16 или EBCDIC.   -  person Jeremy W. Sherman    schedule 20.04.2011


Ответы (4)


Обычно это очень плохая идея - сворачивать регистр таким образом, это действительно работает только для 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 char-temp pic 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 не очень хорошо относится к однобайтовой двоичной математике, поэтому вам нужно, чтобы ваш персонаж соответствовал младшему байту двоичного числа, в данном случае 2-байтового двоичного числа.

person Joe Zitzelberger    schedule 21.04.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

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

person Stephen Gennard    schedule 19.04.2011

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

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

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

person NealB    schedule 20.04.2011

Может ли кто-нибудь привести мне пример того, как, учитывая переменную 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
person Rick Smith    schedule 13.03.2018