RPG

65. 動的配列によるメモリの節約

RPGの中で作業用の配列を使用する場合、たいていは余分目にかなり大きな
項目数のテーブルを用意するものである。
そうしておかないと配列の指標のオーバーのエラーに遭遇するからである。
しかしあまりにも大きな配列の使用による莫大なデータの処理は静的メモリを
不要にも確保してしまい自分ばかりか他の業務にも悪影響を及ぼしてしまう。

ポインターによる配列の定義を行えばコンパイル時に静的なメモリが確保されていまうこともない。
必要な分だけのメモリが実行時に動的に割り振られるので無駄なメモリを確保することもないし、
最大限のサイズを宣言しておけば配列指標のオーバーを心配しなくても良い。
ポインターによる配列の定義は別の項でも紹介しているのでそちらも参照されたい。
ここではユーザー・スペースの読み取りAPI を使用するときのポインターの配列の使用例を紹介する。

0001.00 D STATECD         S              2    DIM(32767) BASED(SPPTR)
0002.00 D USRSPC          DS
0003.00 D  SPACE                        10    INZ('MYSPACE')
0004.00 D  LIB                          10    INZ('QTEMP')
0005.00 C                   CALL      'QUSPTRUS'
0006.00 C                   PARM                    SPACE
0007.00 C                   PARM                    SPPTR

ポインターというのはRPG開発者にはあまり馴染みが無いが変数を割り振る、
すなわち定義するときの番地のことである。
通常、RPGで変数(フィールド)を定義すると長さや属性だけを定義しているように思えるが
実は内部ではメモリ番地も定義されている。(RPGコンパイル・リスト参照)
ポインターによる定義はこのメモリ番地のみを定義して、使用する直前になってから
その長さを定義するやり方である。
OS/400のAPIのパラメータの多くはポインターによって定義されている。
これは OS/400のAPIのほとんどは C言語で書かれているためであり、
このことを利用すると様々な工夫に応用もできる。
但しC言語などで、適切でないポインターが指示されたりするとポインターのエラーとなるのは当然だが、
長さが不明な場合でもポインターであればパラメータとして定義することができる。

参考までにJava では C言語のポインターのトラブルを無くすためにポインターという概念は
一切使われていない。
しかし Java にポインターのトラブルが一切起こらないかと言うとそうでもない。