C の int と同様の方法で、オーバーフローしたときに「ラップ ラウンド」する ILE RPG の数値型を探しています。そのようなことはありますか?
3 に答える
固定形式の数学演算 (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 が 2011 年 1 月 11 日 15:39:15 にサブシステム QINTER で開始されました メッセージ待ち行列 SPRICE は別のジョブに割り振られています。
DSPLY 現在値 002
RPGはそれをさせません。私が提案できる最善の解決策は、計算を行い、オーバーフローを処理するプロシージャを作成することです。RPG には TRUNCNBR コンパイル オプションと制御仕様キーワードがありますが、特定のシナリオでのみ適用されます。
単純なカウンターを実行している場合は、次のように数値フィールドが重複するデータ構造を作成できます。
DCounterDS DS
D Counter 5 8 0
D CountOverflow 1 4 0
D WholeCounter 1 8 0 INZ(0)
次に、WholeCounter に追加し、その直後に CountOverflow をゼロにします。この例では、Counter は 4 桁の数字です。整数フィールドでも同じことができますが、符号なしのままにしておくことをお勧めします。
DCounterDS DS
D Counter 5 8U 0
D CountOverflow 1 4U 0
D WholeCounter 1 8U 0 INZ(0)
繰り返しますが、これは手順で行うのが最適です。
または、オーバーフローが発生したときにエラー コードを監視できます。
D Counter S 10I 0
/FREE
Monitor;
Counter += 1;
On-Error 103;
Clear Counter;
EndMon;
/END-FREE