RPG

472. ILE-RPGのポインタの落とし穴

サービス・プログラムなどを駆使して高度な開発を
行っている人に注意したいポインタに関わる落とし穴がある。
_

[例1]

0001.00 D DATABASE        S             20A   BASED(DATABASE_P)

[解説]

まずこの例を見て欲しい。
これは20桁のフィールド変数: DATABASEを定義している記述であるが
同時にポインタ: DATABASE_P を基底としている変数でもある。
この一行で 変数: DATABSE だけでなく ポインタ: DATABASE_P も
同時に定義されている。
ポインタ: DATABASE_Pの未定義CPF7030のエラーとはならない。
この一行だけで 変数: DATABSE とボタン: DATABASE_P の両方を
同時に定義できているのである。

そこで次に

[例2]

0001.00 D DATABASE_P      S               *                   
0002.00 D DATABASE        S             20A   BASED(DATABSE_P)

を見て欲しい。これはプログラマーがまずポインタ: DATABASE_Pを定義して
そのポインタを基底とする変数: DATABSEを定義したともりであるが
よく見ると BASED(DATABSE_P) のスペルが誤っている。
しかし[例1]で示したようにこれは誤りの名前のポインタ: DATABSE_P も
合せて定義されるだけでコンパイル・エラーとならない。

この状態でコンパイルは正常に通ってしまうので DATABSE_P のスペル・ミスには
なかなか気づかない。
これがポインタ定義の落とし穴である。
 _

このことがあることを認識しておかないと思わぬ落とし穴にハマッてなかなか
真のエラーには気づかなくなってしまう。
[例1] の方法での記述はやはりIBMはコンパイル・エラーにするべきであったろう。
便利になるようにと同時に定義できるようにしてしまったので
落とし穴にハマッてしまうことになる。