変更の始まり

可変次元配列

可変次元配列は DIM(*AUTO:maximum_elements) または DIM(*VAR:maximum_elements) を使用して定義されます。 2 番目のパラメーターは、配列の要素の最大数を示します。

配列の要素数はゼロに初期化されます。 配列の要素数は、%ELEM 組み込み関数を使用して変更できます。 以下の例では、配列の要素の最大数は 100 ( 1 ) です。 配列の現在の要素数は、%ELEM 組み込み関数を使用して 25 ( 2 ) に設定されています。
DCL-S var_array1 CHAR(10) DIM(*VAR : 100); //  1 

%ELEM(var_array1) = 25; //  2 
可変次元配列が DIM(*AUTO) を使用して定義される場合は以下のようになります。

以下の例では、配列は最大 1000 要素 ( 1 ) で定義されています。 値が配列の要素 100 ( 2 ) に代入された場合、要素の現在の数は 100 に増やされます。 前の要素数がゼロであったので、要素 1 から 99 は配列の初期設定値で初期化されます。

値が配列の要素 50 ( 3 ) に代入された場合、要素数は変更されません。50 は現在の要素数より小さいからです。
DCL-S auto_array1 CHAR(10) DIM(*AUTO : 1000);  //  1 

auto_array1(100) = 'abc'; //  2 
auto_array1(50) = 'abc';  //  3 
現在の要素数は %ELEM を使用して減らすこともできます。 以下の例では、要素 100 ( 1 ) への代入のために、現在の要素数は 100 に変更されています。 %ELEM への代入により25 ( 2 ) に減らされます。
DCL-S auto_array2 CHAR(10) DIM(*AUTO : 1000);

auto_array2(100) = 'abc'; //  1 
%elem(auto_array2) = 25;  //  2 

可変次元配列の制約事項

  • 可変次元配列には、最上位の定義で、独立型の配列かデータ構造配列のいずれかのみを指定できます。 テーブル、複数オカレンス・データ構造、サブフィールド、プロシージャーの戻り値、およびプロシージャーのパラメーターは指定できません。
  • 可変次元配列は固定形式の計算で使用できません。
  • 可変次元配列はポインターに基づいて作成することはできません。
  • 可変次元配列はインポートおよびエクスポートできません。
  • 可変次元配列がプロトタイプ・プロシージャーまたはプログラムにパラメーターとして渡される場合、そのパラメーターは OPTIONS(*VARSIZE) を使用して定義する必要があります。
  • 可変次元配列には、タイプ Object を設定できません。
  • 可変次元配列はヌル値可能にすることができません。
  • 可変次元データ構造配列のサブフィールドは、ヌル標識も同じデータ構造内のサブフィールドである場合を除いて、ヌル値可能にすることができません。
  • 可変次元配列は、指標が指定される場合を除いて、入力仕様に指定することはできません。
  • 可変次元配列は、指標が指定される場合を除いて、出力仕様に指定することはできません。
  • 可変次元配列は、先読み入力仕様に指定することはできません。
  • 可変次元配列は、コンパイル時配列および実行時前配列にすることはできません。 CTDATA キーワードと FROMFILE キーワードを使用できません。

例: DIM(*AUTO) で定義された配列に指標として *NEXT を使用

以下の例では、配列は DIM(*AUTO) で定義されています。 ファイル CUSTFILE にフィールド NAME があると想定します。 CUSTNAMES(*NEXT) への代入時 ( 1 )、次元は 1 だけ増やされ、NAME の値は新規要素に代入されます。
DCL-F custfile;
DCL-S custNames VARCHAR(10) DIM(*AUTO : 1000);

READ custfile;
DOW NOT %EOF;
   custNames(*next) = NAME;  //  1 
   READ custfile;
ENDDO;

例: 新規要素の値を変更せずに、現在の要素数を増やす

通常は要素数が増えると、新規要素は配列の初期設定値で初期化されます。 新規要素のデータがすでに正しいことを分かっている場合、%ELEM の 2 番目のパラメーターとして *KEEP を指定すると、新規要素が初期化されないようにすることができます。

以下の例では、現在の要素数が 5 に設定されており ( 1 )、 新規要素は初期設定値「?」に初期化されます.

現在の要素数が 3 に設定されている場合 ( 2 )、 要素 4 と 5 には、直前の代入ステートメントによって値「d」と「e」が入ります。

現在の要素数が 4 に設定されており、 %ELEM の 2 番目のパラメーターとして *KEEP が指定された場合 ( 3 )、新規要素 4 の値は変更されず、値は「d」になります。

現在の要素数が 5 に設定されており、 %ELEM の 2 番目のパラメーターとして *KEEP が指定されていない場合 ( 4 )、新規要素 5 の値は初期設定値「?」に設定されます。.
DCL-S var_array2 CHAR(10) INZ('?') DIM(*VAR : 1000);

%elem(var_array2) = 5;       //  1 
var_array2(1) = 'a';
var_array2(2) = 'b';
var_array2(3) = 'c';
var_array2(4) = 'd';
var_array2(5) = 'e';
%elem(var_array2) = 3;       //  2 
%elem(var_array2:*KEEP) = 4; //  3 
%elem(var_array2) = 5;       //  4 

例: 配列に十分な要素数が割り振られるようにする

%ELEM の 2 番目のパラメーターとして *ALLOC を指定すると、 配列の現在の要素数を変更せずに、配列に割り振られる要素数を増やすことができます。

以下の例では、配列を参照によってプロシージャーに渡し、一部の配列要素の値を設定します。 プロシージャーの呼び出し前、配列に割り振られる要素数は 100 に設定されています ( 1 )。 ただし、現在の要素数はゼロのままです。

プロシージャーに渡される 2 番目のパラメーターは、プロシージャーが設定できる要素数を指定します。 プロシージャーは、設定した要素数 ( 2 ) を返します。

*KEEP を指定した %ELEM を使用して新しい現在の要素数 ( 3 ) を設定します。

DCL-S var_array3 CHAR(10) INZ('?') DIM(*VAR : 1000);
DCL-S num_elems INT(10);
DCL-PR proc INT(10);
   array CHAR(10) DIM(1000) OPTIONS(*VARSIZE);
   max_elems INT(10) VALUE;
END-PR;
%elem(var_array3:*ALLOC) = 100;      //  1 
num_elems = proc(var_array3 : 100);  //  2 
%elem(var_array2:*KEEP) = num_elems; //  3 
変更の終わり