CL

112. CLPのパラメータの注意(2)

次に先に説明した、

 (2) RPGやCOBOLなどへパラメータを渡す場合

について解説する。
CLPでの数字の変数はパック形式であると説明したように
ゾーン10進数はパラメータとして使わないようにする。
ゾーン10進数を使いたい場合は文字変数として定義しておいてから
パック数字変数に移すことができるのだろうか?

0001.00              PGM                                                      
0002.00              DCL        VAR(&FLD3) TYPE(*CHAR) LEN(3) VALUE(X'F1F2F3')
0003.00              DCL        VAR(&DEC30) TYPE(*DEC) LEN(3 0)               
0004.00                                                                       
0005.00              CHGVAR     VAR(&DEC30) VALUE(&FLD3)                      
0006.00              ENDPGM                                                   

文字フィールド &FLD3 にはゾーン10進数形式で 123 という数字が入っている。
これを

CHGVAR VAR(&DEC30) VALUE(&FLD3)

でパック形式の数字変数: DEC03 に移すとどうなるのだろう?

デバッグで &DEC03 の変数値を調べてみると

&DEC03 = 123

という値が入っている。
しかし安心してはいけない。今度は

 
0002.00              DCL        VAR(&FLD3) TYPE(*CHAR) LEN(3) VALUE(X'F1F2D3')

というように ゾーン10進数形式 -123 を代入してみると

値を受け入れ側のタイプに変換することができない

というエラーが発生してゾーン10進数 -123を代入することができなかった。

 
             DCL        VAR(&NINUS) TYPE(*CHAR) LEN(3) VALUE(X'F1F2D3')

             IF         COND(&FLD3 *EQ &MINUS) THEN(DO) 
             CHGVAR     VAR(&DEC03) VALUE(-123)         
             ENDDO                                      
             ELSE       CMD(DO)                         
             CHGVAR     VAR(&DEC30) VALUE(&FLD3)        
             ENDDO     

というような苦肉の策もないわけではない。
いずれにせよ負の値(マイナス値)の可能性があるゾーン10進数を
パック形式の数字変数に代入するのはかなりやっかいであると
理解しておいて欲しい。