C'è un tipo numerico in RPG ILE, che traboccherà senza schiantarsi mio programma?
-
16-09-2019 - |
Domanda
Sto cercando un tipo numerico in RPG ILE che "wrap rotonda" quando trabocca, in maniera simile a come un int C avrebbe fatto. C'è una cosa simile?
Soluzione
RPG non ti consente di farlo. La soluzione migliore che posso suggerire sarebbe quello di creare una procedura che fa la matematica per voi e gestisce l'overflow. Mentre RPG ha la possibilità TRUNCNBR compilazione e controllo specifiche parole chiave, è applicabile solo in determinati scenari.
Se stai facendo un semplice contatore, è possibile creare una struttura dati con sovrapposizione campi numerici in questo modo:
DCounterDS DS
D Counter 5 8 0
D CountOverflow 1 4 0
D WholeCounter 1 8 0 INZ(0)
quindi si aggiunge a WholeCounter e poi zero out CountOverflow subito dopo. In questo esempio, Counter è un numero a 4 cifre. Si può fare la stessa cosa con campi di numeri interi, ma vi consiglio di tenerli senza segno:
DCounterDS DS
D Counter 5 8U 0
D CountOverflow 1 4U 0
D WholeCounter 1 8U 0 INZ(0)
Ancora una volta, questo è meglio farlo in una procedura.
Altri suggerimenti
È possibile utilizzare le operazioni matematiche formato fisso (aggiungere, sub, Mult, e div). Saranno troncare al raggiungimento di overflow. Ingombrante ma funziona.
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;
I messaggi di visualizzazione del programma
Job 912.834 / Sprice / DP88LT iniziata il 01/11/11 alle 15:39:15 nel sottosistema QINTER
coda di messaggi Sprice è assegnato a un altro lavoro.
DSPLY Il valore corrente 002
In alternativa è possibile monitorare per il codice di errore quando si verifica un overflow:
D Counter S 10I 0
/FREE
Monitor;
Counter += 1;
On-Error 103;
Clear Counter;
EndMon;
/END-FREE