RPG

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

前の章では %ADDR でポインターを定義できることを学んだ。
本章では、別の方法によるポインターの定義の方法を紹介しよう。

【例】 BASED キー・ワードによるポインターの定義
	D RESDTA          S             10A   BASED(RESP)
	   :
	C                   EVAL      RESP = GetWEBENV(KWDP)
【解説】

上記の例のように BASED を使ってポインター RESP を定義することができる。
BASED は基底を意味していて RESP というポインターを基底とする変数 RESDTA
定義することを意味している。
ポインター RESP

	D RESP            S               *

のようにして別途にポインターであることを定義する必要はない。
BASED(RESP) の記述だけで RESP はポインターであると定義されたことになる。

このように BASED を使ってポインターを定義する目的は API などから
戻り値としてポインターを受け取る場合である。
そして戻り値としてのポインターは別の変数を表しているはずである。

	C                   EVAL      RESP = GetWEBENV(KWDP)

のようにして別の関数(プロシージャー)からの戻り値をポインターとして受け取り
そのポインターは何らかの変数を代表しているときに BASED を使ってポインターを定義しておけば

	C                   EVAL      RESP = GetWEBENV(KWDP)

の演算の次には、直ちに

	C                   EVAL      RESP = GetWEBENV(KWDP)
	C                   MOVEL     RESDTA        DSPSIZ_

のように RESDTA を使用することができる。

このように戻り値をポインターで受け取る場合には BASED でポインターを定義しておくと
有効であることがわかる。
逆にパラメータとしてポインターを渡す場合には %ADDR によってポインターを定義する手法を
とることが有効となる。

これで使用目的によってポインターの定義の仕方が異なることが明確になった。
このようなことまでは IBM 解説書にも解説はされていない。
使用目的による定義が異なることを明確に区別しておけば実践において混乱することはなくなるだろう。

この章で学んだことは

  • BASED を使ってポインターを定義することができる
  • BASED は戻り値がポインターである場合の定義として有効である
  • %ADDR によるポインターの定義はパラメータとしてポインターを渡す場合に有効である