Existe um tipo numérico em ILE RPG que vai transbordar sem bater meu programa?
-
16-09-2019 - |
Pergunta
Eu estou procurando um tipo numérico em ILE RPG que irá "wrap round" quando transborda, de uma forma semelhante à forma como um int C faria. Existe tal coisa?
Solução
RPG não vai deixar você fazer isso. A melhor solução que pode sugerir seria a criação de um procedimento que faz a matemática para você e lida com o transbordamento. Enquanto RPG tem a opção TRUNCNBR compilação e controle chave spec, que é aplicável apenas em determinados cenários.
Se você está fazendo um contador simples, você pode criar uma estrutura de dados com sobreposição de campos numéricos como esta:
DCounterDS DS
D Counter 5 8 0
D CountOverflow 1 4 0
D WholeCounter 1 8 0 INZ(0)
Em seguida, você adicionar a WholeCounter e depois de zero-out CountOverflow imediatamente depois. Neste exemplo, contador é um número de 4 dígitos. Você pode fazer a mesma coisa com campos inteiros, mas eu recomendo que você mantê-los sem sinal:
DCounterDS DS
D Counter 5 8U 0
D CountOverflow 1 4U 0
D WholeCounter 1 8U 0 INZ(0)
Mais uma vez, este é o melhor feito em um procedimento.
Outras dicas
Você pode usar as operações matemáticas formato fixo (add, sub, mult, e div). Eles irão truncar quando estouro é atingido. Complicado, mas funciona.
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;
As mensagens de exibição do programa
Job 912.834 / Sprice / DP88LT começou em 01/11/11 às 15:39:15 em QINTER subsistema
fila de mensagens Sprice é alocado para outro emprego.
DSPLY O valor atual 002
Ou você pode monitorar para o código de erro quando um estouro acontece:
D Counter S 10I 0
/FREE
Monitor;
Counter += 1;
On-Error 103;
Clear Counter;
EndMon;
/END-FREE