以前にも紹介しているがプロシージャーに渡すパラメータ値に値を戻したい場合がある。
例えば結果は成功/失敗を戻すだけで、結果の値はパラメータそのものに
入れて戻したい場合もある。
さらに複数個の結果が必要である場合はパラメータに入れて戻したいのは
当然かも知れない。
例えば次のプログラムがあったとする。
0001.00 H DATEDIT(*YMD/) COPYRIGHT('(C) OfficeQuattro Co,.Ltd Japan 2006-') 0002.00 F********** プロシージャーの呼び出しA ******************************** 0003.00 D*( SETFLD のプロトタイプ宣言 ) 0004.00 D SETFLD PR 0005.00 D FLD 10A Value 0006.00 D FIELD S 10A INZ 0007.00 C CALLP SETFLD(FIELD) 0008.00 C FIELD DSPLY ANS 1 0009.00 C SETON LR 0010.00 C RETURN 0011.00 ********************************************************************** 0012.00 * SETFLD プロシージャーの定義 * 0013.00 ********************************************************************** 0014.00 P SETFLD B EXPORT 0015.00 D SETFLD PI 0016.00 D FLD 10A Value 0017.00 D FIELD S 10A 0018.00 C MOVEL 'NV-CF1' FIELD 0019.00 P SETFLD E
プロシージャー SETFLD
の中で MOVEL 'NV-CF1' FIELD
を行っているので
結果の値の表示 : FIELD DSPLY ANS
によって NV-CF1
という値が表示されるかというと、そうではない。
パラメータ : FIELD
の値がプロシージャーの中から戻されることはないからである。
それではこの問題をどのようにして解決すればよいのであろうか?
C言語のポインターに精通している人であれば気づくかもしれない。
ポインタが正しく理解されていれば難しい問題ではない。
プロシージャーで受け取ったパラメータが渡したパラメータと実体が
同じものであることにすればよいのである。
パラメータとしてフィールドそのものではなくフィールドのポインタを渡せば
メモリ空間上での同じものを受け取り側でも再現できるので、
渡す側と受け取る側は同じ実体を扱うことができるようになる。
つまりポインタをパラメータとして渡せばよいことになる。
これは ANS-C
言語の場合と全く、同じ手法である。
それでは正解のソースを紹介しよう。
この例では DSPLY
命令で正しく「NV-CF1
」の値が表示される。
0001.00 H DATEDIT(*YMD/) COPYRIGHT('(C) OfficeQuattro Co,.Ltd Japan 2006-') 0002.00 F********** プロシージャーの呼び出しB ******************************** 0003.00 D*( SETFLD のプロトタイプ宣言 ) 0004.00 D SETFLD PR 0005.00 D FLD * Value 0006.00 D FIELD S 10A INZ 0007.00 C CALLP SETFLD(%ADDR(FIELD)) 0008.00 C FIELD DSPLY ANS 1 0009.00 C SETON LR 0010.00 C RETURN 0011.00 ********************************************************************** 0012.00 * SETFLD プロシージャーの定義 * 0013.00 ********************************************************************** 0014.00 P SETFLD B EXPORT 0015.00 D SETFLD PI 0016.00 D FLDPTR * Value 0017.00 D FIELD S 10A BASED(FLDPTR) 0018.00 C MOVEL 'NV-CF1' FIELD 0019.00 P SETFLD E
【 解説 】
SETFLD
では %ADDR(FIELD)
として FIELD
のポインタを渡している。
受け取り側では 受け取ったポインタ FLDPTR
を基底とする FIELD
に
値を入れて戻している。