以前にも紹介しているがプロシージャーに渡すパラメータ値に値を戻したい場合がある。
例えば結果は成功/失敗を戻すだけで、結果の値はパラメータそのものに
入れて戻したい場合もある。
さらに複数個の結果が必要である場合はパラメータに入れて戻したいのは
当然かも知れない。
例えば次のプログラムがあったとする。
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 に
値を入れて戻している。