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
のような演算を追加するとこの障害を予め監視することができる。
バイナリ演算のこのエラーの内容は非常にわかりにくいので
ここに解説として追加した。
このエラーの原因は代入に問題があるのではなく
定義の長さがオーバーしていることにある。
これがわからないと相当の時間、悩んでしまうことになる。