Y at-il un type numérique en RPG ILE qui débordera sans écraser mon programme?
-
16-09-2019 - |
Question
Je suis à la recherche d'un type numérique dans RPG ILE qui « wrap rond » quand il déborde, d'une manière similaire à la façon dont un C int serait. Y at-il une telle chose?
La solution
RPG ne vous laissera pas faire. La meilleure solution que je peux suggérer serait de créer une procédure qui fait le calcul pour vous et gère le trop-plein. Alors que RPG a la possibilité de compiler TRUNCNBR et mot-clé spécification de contrôle, il est seulement applicable dans certains scénarios.
Si vous faites un simple compteur, vous pouvez créer une structure de données avec des champs numériques se chevauchent comme ceci:
DCounterDS DS
D Counter 5 8 0
D CountOverflow 1 4 0
D WholeCounter 1 8 0 INZ(0)
Ensuite, vous ajoutez à WholeCounter puis zéro-out CountOverflow immédiatement après. Dans cet exemple, le compteur est un numéro à 4 chiffres. Vous pouvez faire la même chose avec des champs entiers, mais je vous recommande de les garder non signé:
DCounterDS DS
D Counter 5 8U 0
D CountOverflow 1 4U 0
D WholeCounter 1 8U 0 INZ(0)
Encore une fois, cela est mieux fait dans une procédure.
Autres conseils
Vous pouvez utiliser les opérations mathématiques format fixe (ajouter, sous, mult et div). Ils tronquer quand débordement est atteint. Lourdeur mais fonctionne.
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;
Messages du programme d'affichage
Job 912834 / Sprice / DP88LT a commencé le 01/11/11 à 15:39:15 dans le sous-système QINTER
file d'attente de messages Sprice est affecté à un autre emploi.
DSPLY La valeur actuelle 002
Ou vous pouvez suivre le code d'erreur lorsqu'un dépassement se produit:
D Counter S 10I 0
/FREE
Monitor;
Counter += 1;
On-Error 103;
Clear Counter;
EndMon;
/END-FREE