Есть ли в ILE RPG числовой тип, который будет переполняться без сбоя моей программы?
-
16-09-2019 - |
Вопрос
Я ищу числовой тип в ILE RPG, который будет «заворачиваться» при переполнении, аналогично тому, как это делает C int.Что-то подобное существует?
Решение
РПГ не позволит вам этого сделать.Лучшее решение, которое я могу предложить, — это создать процедуру, которая выполняет математические вычисления за вас и обрабатывает переполнение.Хотя в RPG есть опция компиляции TRUNCNBR и ключевое слово спецификации управления, они применимы только в определенных сценариях.
Если вы создаете простой счетчик, вы можете создать структуру данных с перекрывающимися числовыми полями, например:
DCounterDS DS
D Counter 5 8 0
D CountOverflow 1 4 0
D WholeCounter 1 8 0 INZ(0)
Затем вы добавляете к WholeCounter, а затем сразу же обнуляете CountOverflow.В этом примере счетчик представляет собой четырехзначное число.Вы можете сделать то же самое с целочисленными полями, но я рекомендую оставить их без знака:
DCounterDS DS
D Counter 5 8U 0
D CountOverflow 1 4U 0
D WholeCounter 1 8U 0 INZ(0)
Опять же, лучше всего это делать в рамках процедуры.
Другие советы
Вы можете использовать математические операции фиксированного формата (add,sub,mult и div).Они будут усекаться при достижении переполнения.Громоздко, но работает.
0001.00 D Fld1 s 3 0
0001.01 D
0002.00 C 999 add 3 Fld1
0003.00 /free
0004.00 dsply ('The current value '+%editc(Fld1:'X'));
0005.00 *inlr=*on;
0006.00 return;
Отображать сообщения программы
Работа 912834/sprice/dp88lt начался 01.01.11 в 15:39:15 в подсистеме QInter Queue Ofeue Ofeue Sprice выделяется на другую работу.
DSPLY Текущее значение 002
Или вы можете отслеживать код ошибки, когда происходит переполнение:
D Counter S 10I 0
/FREE
Monitor;
Counter += 1;
On-Error 103;
Clear Counter;
EndMon;
/END-FREE