RPG

234. RPGプログラマーのためのポインター講座 (5)

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 という言語の進化であり、ポインターはやはり必要不可欠な機能であったのだ。

  • ポインターとはフィールドの開始位置を示すアドレスである
  • ポインターは必ず関連するフィールドを定義してから利用する
  • ポインターは可変長のフィールドを定義するのに便利である

ポインターのポインターもまたポインターである。