#cobol
#cobol
Вопрос:
Я хотел бы написать функцию на COBOL, которая преобразует символы из типа данных PIC X (60) в верхний регистр. Хотя я знаю один способ сделать это, я хотел бы иметь возможность вручную перебирать буквы и добавлять константу для перехода от нижнего регистра к верхнему, но, похоже, я не могу выполнить какую-либо арифметику для типов данных PIC X, если я не переопределю их как что-то другое, но тогда я, кажется, искажаю исходный символ X.
Может ли кто-нибудь привести мне пример того, как, учитывая переменную PIC X, вы можете увеличить ее на 1 букву (т. Е. a -> b, d -> e … и т.д.). Другими словами, я хотел бы иметь возможность добавлять 1 к этой переменной:
01 char-temp pic x.
Спасибо,
Иван
Комментарии:
1. Я настоятельно рекомендую вам изучить COBOL и прекратить пытаться делать с ним вещи на «C». Это не то, как работает COBOL.
2. Почему вы предполагаете, что
PIC
тип закодирован таким образом, что добавления константы будет достаточно для заглавной буквы символа? Даже если это простая строка без какого-либо заголовка или трейлера, добавленного реализацией, вы все равно можете иметь дело с символами, закодированными какUTF-16
илиEBCDIC
.
Ответ №1:
Обычно это очень плохая идея выполнять сворачивание регистра таким образом, это действительно работает только для 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 символу-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 байта.
Ответ №2:
Вы могли бы быть непослушными и использовать переопределения, например:
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
и я уверен, что это и другие подходы…
Ответ №3:
Один символ обычно занимает один байт памяти. Стандартный COBOL не имеет двоичного числового типа данных в один байт (Примечание: PIC 9 USAGE DISPLAY
это символьное представление цифры, а не двоичное представление цифры). Итак, выполнение двоичной арифметики для отдельных символов в COBOL у вас не сработает.
Даже если вы могли бы выполнить арифметику над символами, вы можете сделать неверное предположение о двоичном представлении символов — буква ‘b’ не обязательно равна двоичному представлению ‘a’ плюс 1 (это может работать для ASCII, но не для EBCDIC).
Наконец, если вы хотите заменить один символ другим, вам следует изучить инструкцию COBOL INSPECT
. В отличие от перебора битов, INSPECT
полностью переносим.
Ответ №4:
Может ли кто-нибудь привести мне пример того, как, учитывая переменную 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