CLP でもポインターを扱うことができる。
ポインターを定義するには
DCL VAR(&PTR) TYPE(*PTR)
のようにして DCL (DECLARE) 文で定義すればよい。
変数とポインターを関連して定義するには
DCL VAR(&VALUE_P) TYPE(*PTR) DCL VAR(&VALUE) TYPE(*CHAR) STG(*BASED) + LEN(1025) BASPTR(&VALUE_P)
のように定義する。
ここで &VALUE_P
はポインターであり、&VALUE
は
ポインター &VALUE_P
を基底とする 1035バイトの文字列である。
演算で使用するには
CALLPRC PRC(RPGCGIPARM) PARM((&PTR *BYVAL) ('1' + *BYVAL)) RTNVAL(&VALUE_P) CHGVAR VAR(&VALIDI) VALUE(%SST(&VALUE 1 640))
のようにしてプロシージャー RPGCGIPARM にパラメータとして
&VALUE_P
を渡して結果の値 &VALUE
を取得して利用するという方法である。
先にも説明したがプロシージャー にポインターをパラメータとして渡しているので
パラメータが更新された値を受け取ることができるのだが、単に変数だけを
パラメータとして渡したのではパラメータの変更値は受け取ることはできない。
この場合は別々のメモリーを指していることになるので変更が反映されないことは
先にも説明したので、ご理解されていることと思う。
参考までにサービス・プログラム( *SRVPGM ) のプロシージャーを呼び出すCLP
( CLLE ) のコンパイルは CRTCLPGM ではなく、
CRTCLMOD + CRTPGM
の組み合わせによって行うこと。
これまでポインターの利用方法について解説してきたが、いかがであったろうか ?
ポインターは可変長のフィールドを示すのに便利な機能である。
Java はポインターでのエラーが多いからといってポインターを廃止してしまったが
Java でもポインター・エラーは立派に出るのに、ポインターの優位性を利用することは
できない。
API は可変長のフィールドを扱うためにポインターと受け取り変数の長さをセットにして
定義するようにしている。
ポインターは積極的に使って慣れることである。
RPG も初めはポインターを扱う機能は用意されていなかったのだが
ILE となって C言語の char*
などのポインターを扱えるようにするために
ポインターの概念を導入するに至った。
これも RPG という言語の進化であり、ポインターはやはり必要不可欠な機能であったのだ。
ポインターのポインターもまたポインターである。