RPG

44. ILE-RPG の動的配列の使用法

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