¿Hay un tipo numérico en ILE RPG que se desborde sin que se caiga mi programa?
-
16-09-2019 - |
Pregunta
Estoy buscando un tipo numérico en ILE RPG que "saltará" cuando se desborda, de una manera similar a como un int C haría. ¿Existe tal cosa?
Solución
RPG no va a dejar que hagas eso. La mejor solución que puedo sugerir sería la creación de un procedimiento que hace los cálculos para usted y maneja el desbordamiento. Mientras RPG tiene la opción de compilación TRUNCNBR y el control de palabras clave de especificaciones, sólo es aplicable en ciertos escenarios.
Si estás haciendo un simple contador, puede crear una estructura de datos con la superposición de los campos numéricos como esto:
DCounterDS DS
D Counter 5 8 0
D CountOverflow 1 4 0
D WholeCounter 1 8 0 INZ(0)
A continuación, añadir a WholeCounter y luego cero a cabo CountOverflow inmediatamente después. En este ejemplo, contador es un número de 4 dígitos. Usted puede hacer lo mismo con los campos de enteros, pero recomiendo que mantenerlos sin firmar:
DCounterDS DS
D Counter 5 8U 0
D CountOverflow 1 4U 0
D WholeCounter 1 8U 0 INZ(0)
Una vez más, esto se hace mejor en un procedimiento.
Otros consejos
Puede utilizar las operaciones matemáticas de formato fijo (añadir, submarino, mult y div). Ellos se truncará cuando se alcanza desbordamiento. Engorroso, pero 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;
Los mensajes programa de visualización
Trabajo 912834 / Sprice / DP88LT comenzó el 01/11/11 a las 15:39:15 en QINTER subsistema
Sprice cola de mensajes es asignado a otro puesto de trabajo.
DSPLY El valor actual 002
O se podría controlar para el código de error cuando ocurre un desbordamiento:
D Counter S 10I 0
/FREE
Monitor;
Counter += 1;
On-Error 103;
Clear Counter;
EndMon;
/END-FREE