RPG で使用する配列の大きさを考えられるだけ大きなサイズで静的に定義したとする。
しかも、かなり大きなサイズが必要である場合だ。
配列に収めるデータが動的に変化するのであれば、最大限の項目数を用意しておいても、
- 配列の項目数をオーバーするかも知れない。指標オーバーは防止できない。
- 少ないデータのときでも 配列の数が大きいためプログラム・サイズも大きくなってしまう。
- プログラム・サイズが大きくなると非効率だけでなく起動時間を要する。
これらの問題をスマートに解決する方法がある。
それは動的配列(ダイナミック・アレイ)を定義することである。
C/400 すなわち C言語であれば malloc によって動的にメモリを確保することができるが
実は ILE-RPGでも ILE-API を使用すれば可能になる。
しかし、C/400を使わずに V3R1M0 から使用できる方法である。
静的な配列を定義した場合と以下の方法を使用した場合のプログラム・サイズをDSPPGM で
比べてみて欲しい。驚くほど減少していることだろう。
なおコンパイルは、
CRTRPGMOD OPTIMIZE(*FULL) CRTPGM ACTGRP(*CALLER)
を指定すること。
0001.00 H DFTNAME(DMCARY) DATEDIT(*YMD/) 0002.00 F********** 動的配列の生成 *************************************** 0003.00 F* 0004.00 F***************************************************************** 0005.00 D STB S 1 DIM(5000) BASED(ARYPTR) 0006.00 D 0007.00 D HEAPID S 9B 0 0008.00 D SIZE S 9B 0 0009.00 D FREEBK S 12A 0010.00 C*( 最初の配列項目数を 1000 に設定する。 ) 0011.00 C Z-ADD 1000 ARYMAX 5 0 0012.00 C*( MALLOC ) 0013.00 C EVAL SIZE = %SIZE(STB) * ARYMAX 0014.00 C*----------------------------------------------------+ 0015.00 C CALLB 'CEEGTST' 0016.00 C PARM HEAPID 0017.00 C PARM SIZE 0018.00 C PARM ARYPTR 0019.00 C PARM FREEBK 0020.00 C*----------------------------------------------------+ 0021.00 C*( 1000 を超える値として 4500 を配列指標に設定する。 ) 0022.00 C Z-ADD 4500 SAVLEN 0023.00 C*( 配列の最大数を拡張する。 ) 0024.00 C SETOFF 50 0025.00 C SAVLEN DOWGT ARYMAX 0026.00 C ADD 1000 ARYMAX 0027.00 C EVAL SIZE = %SIZE(STB) * ARYMAX 0027.00 C SETON 50 0028.00 C END 0029.00 C*( REALLOC )- メモリーを再割振りする。 0030.00 C *IN50 IFEQ *ON 0031.00 C*----------------------------------------------------+ 0032.00 C CALLB 'CEECZST' 0033.00 C PARM ARYPTR 0034.00 C PARM SIZE 0035.00 C PARM FREEBK 0036.00 C*----------------------------------------------------+ 0037.00 C END 0038.00 C*( 4500 番目にMOVEする。 ) 0039.00 C MOVEA 'TESTDTA' STB(SAVLEN) 0040.00 C*( FREE MEMORY )- メモリーを解放する。 0041.00 C*----------------------------------------------------+ 0042.00 C CALLB 'CEEFRST' 0043.00 C PARM ARYPTR 0044.00 C PARM FREEBK 0045.00 C*----------------------------------------------------+ 0046.00 C SETON LR 0047.00 C RETURN