動的にサイズ指定される配列の使用

ある配列で必要な要素の数が実行時までわからない場合には、 最大サイズでその配列を定義しておいて、その配列のサブセットをプログラムで使用することができます。

そのためには、1 つの命令で配列のすべての要素を操作する場合に、%SUBARR 組み込み関数を使用してどの要素を使用するのかを制御します。 また、%LOOKUP 組み込み関数を使用して、 配列の一部を検索することもできます。

図 77. 動的にサイズ指定される配列の使用例
 * Define the "names" array as large as you think it could grow
D names           S             25A   VARYING DIM(2000)
 * Define a variable to keep track of the number of valid elements
D numNames        S             10I 0 INZ(0)
 * Define another array
D temp            S             50A   DIM(20)
D p               S             10I 0
 /free
     // set 3 elements in the names array
     names(1) = 'Friendly';
     names(2) = 'Rusty';
     names(3) = 'Jerome';
     names(4) = 'Tom';
     names(5) = 'Jane';
     numNames = 5;      

     // copy the current names to the temporary array
     // Note: %subarr could also be used for temp, but
     //       it would not affect the number of elements
     //       copied to temp
     temp = %subarr(names : 1 : numNames);      

     // change one of the temporary values, and then copy
     // the changed part of the array back to the "names" array
     temp(3) = 'Jerry';     
     temp(4) = 'Harry';     
     // The number of elements actually assigned will be the
     // minimum of the number of elements in any array or
     // subarray in the expression.  In this case, the
     // available sizes are 2 for the "names" sub-array,
     // and 18 for the "temp" subarray, from element 3
     // to the end of the array.
     %subarr(names : 3 : 2) = %subarr(temp : 3);      
     // sort the "names" array
     sorta %subarr(names : 1 : numNames); 

     // search the "names" array
     // Note: %SUBARR is not used with %LOOKUP.  Instead,
     //       the start element and number of elements
     //       are specified in the third and fourth
     //       parameters of %LOOKUP.
     p = %lookup('Jane' : names : 1 : numNames);