RPG

381. RPGの2進数演算のエラー

ILE-RPGでバイナリ(=2進数)を定義していると

MCH1210: 数値演算のターゲットが小さすぎて結果を入れることができない

との非常にわかりにくい実行時エラーが出ることがある。

例えば

 D  ENTER_                91     92
    :
 D BIN2C           DS             2   
 D  BIN2                   1      2B 0
    :
 C                   EVAL      KEY2 = %SUBST(WUIX:BIN2+1:2)

のような演算命令でMCH1210の演算エラーが出ることがある。
%SUBST とは数字の計算ではなく文字列の取り出しであるので
数値演算の結果を代入するエラーは発生するはずはないと
考えられるが実はエラーは

 C                   EVAL      KEY2 = %SUBST(WUIX:BIN2+1:2)

の代入演算で発生しているのではなく

 D BIN2C           DS             2   
 D  BIN2

で発生している。
このときの状態をデバッグしてみると

BIN2C                 DS                                           
  BIN2                BIN(4,0)             4348.            '380C'X

であった。つまり BIN2Cの値は X’380C’ = 14348 であるが
デバッグ・リストによれば BIN2は 4348 である。
つまり10000の位がオーバーしている。

これが「結果を入れることができない」と示されているエラーである。
真の原因は

C                   EVAL      KEY2 = %SUBST(WUIX:BIN2+1:2)
 

の計算にあるのではなく
BIN2Cを取り出したときにある。つまり BIN2Cを取り出す位置が間違っているか
BIN2Cを定義しているデータの誤りであることを示している。

ユーザー・プログラムでこの問題を監視するには

 C                   IF        BIN2C > X'270F'                  
  /FREE                                                         
     MSG = 'PANEL の BIN2 サイズが不正にオーバーしています。 '; 
  /END-FREE                                                     
 C                   GOTO      PNLERR                           
 C                   ENDIF                                      

 

のような演算を追加するとこの障害を予め監視することができる。

 バイナリ演算のこのエラーの内容は非常にわかりにくいので
ここに解説として追加した。
このエラーの原因は代入に問題があるのではなく
 定義の長さがオーバーしていることにある。
 これがわからないと相当の時間、悩んでしまうことになる。