Есть ли в ILE RPG числовой тип, который будет переполняться без сбоя моей программы?

StackOverflow https://stackoverflow.com/questions/1673403

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top