В CL я пытаюсь преобразовать число (193) в его альфа-представление (A). Ничего не придумывая, нужна небольшая помощь. Есть ли функция CHAR?Десятичное преобразование символов в AS/400
ответ
Этот пример дает EBCDIC символ «A» в переменной & txt1:
PGM
DCL VAR(&NUM) TYPE(*DEC) LEN(3 0) VALUE(193)
DCL VAR(&TXT2) TYPE(*CHAR) LEN(2)
DCL VAR(&TXT1) TYPE(*CHAR) LEN(1)
CHGVAR VAR(%BIN(&TXT2 1 2)) VALUE(&NUM)
CHGVAR VAR(&TXT1) VALUE(%SST(&TXT2 2 1))
SNDUSRMSG MSG(&TXT1)
ENDPGM
Вы должны использовать
CHGVAR VAR(&CHAR) VALUE(&NUM)
Все это возвращает число, оставшееся с нулями. – selpatS20
Вам действительно нужно быть осторожным с тем, что вы делаете. Вы называете программу RPG? Вы можете передать все как * CHAR, даже если программа RPG принимает численные значения. Причиной быть осторожным является то, что литералы передаются с форматами по умолчанию – Abercrombieande
Простейшим в любом недавнем выпуске ОС переопределять или перекрывающих числовое значение с указанием символа:
dcl &numVal *uint 2 value(193)
dcl &charVal *char 1 stg(*DEFINED) defvar(&numVal 2)
В простой программе CL это m РАВО выглядеть следующим образом:
pgm
dcl &numVal *uint 2 value(193)
dcl &charVal *char 1 stg(*DEFINED) defvar(&numVal 2)
/* Show current character equivalence... */
sndusrmsg msg(&charVal) msgtype(*INFO)
/* Set a new numeric value... */
chgvar &numVal (194)
/* Show new character equivalence... */
sndusrmsg msg(&charVal) msgtype(*INFO)
return
endpgm
& значение charVal будет отображаться как «А» в первый раз и «B» второго. Переменная * UINT должна быть определена как переменная размером 2 байта или более, так как CL не может определить целочисленные переменные одного байта. Второй байт 2-байтового целого имеет требуемую битовую диаграмму. Бинарное целочисленное значение имеет шестнадцатеричный эквивалент в памяти, который соответствует символу «A», «B» или тому подобное,
Хорошая альтернатива. Я все еще работаю над системой V5R4, поэтому мой ответ определенно написан с этой точки зрения. – dmc
@dmc Это работает на системах V5R4 и более поздних версий. – user2338816
Полезно знать, спасибо! – dmc
Все это возвращает 0вместо «#» (используя ваш номер в качестве примера). – selpatS20
Я неправильно понял вопрос. Отредактировал примерную программу, чтобы присвоить символ EBCDIC на основе числового значения, а не просто преобразовать число в символ. – dmc