0

C の int と同様の方法で、オーバーフローしたときに「ラップ ラウンド」する ILE RPG の数値型を探しています。そのようなことはありますか?

4

3 に答える 3

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

于 2011-01-11T21:42:07.597 に答える
3

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)

繰り返しますが、これは手順で行うのが最適です。

于 2009-11-04T13:35:40.013 に答える
2

または、オーバーフローが発生したときにエラー コードを監視できます。

 D Counter         S             10I 0

  /FREE
   Monitor;
      Counter += 1;
   On-Error 103;
      Clear Counter;
   EndMon;
  /END-FREE
于 2010-01-28T13:49:29.973 に答える