{[bound:] bound}, 3 |
構文図で使用されている記号については、「構文記号」を参照してください。
array-dimension-definition
オプションを使用して、配列定義の次元の下限と上限を定義します。
最大 3 次元までの配列を定義することができます。
構文要素 | 説明 |
---|---|
bound |
下限/上限:
次のいずれかが境界になります。
1 つの境界だけを指定した場合、その値は上限を表し、下限は 1 であると想定されます。 |
配列の少なくとも 1 つの次元で少なくとも 1 つの境界を拡張可能に指定すると、その配列は X-array(eXtensible array)と呼ばれます。1 つの次元で拡張可能なのは 1 つの境界だけであり(上限または下限のいずれか)、両方を拡張可能にすることはできません。多次元配列では、例えば#a(1:100, 1:*)
のように、定数と拡張可能な境界が混在していることがあります。
例:
DEFINE DATA LOCAL 1 #ARRAY1(I4/1:10) 1 #ARRAY2(I4/10) 1 #X-ARRAY3(I4/1:*) 1 #X-ARRAY4(I4/*,1:5) 1 #X-ARRAY5(I4/*:10) 1 #X-ARRAY6(I4/1:10,100:*,*:1000) END-DEFINE
次の表に、上記のプログラムで使用する配列の境界をわかりやすく示します。
次元 1 | 次元 2 | 次元 3 | ||||
---|---|---|---|---|---|---|
下限 | 上限 | 下限 | 上限 | 下限 | 上限 | |
#ARRAY1 |
1 | 10 | - | - | - | - |
#ARRAY2 |
1 | 10 | - | - | - | - |
#X-ARRAY3 |
1 | 拡張可能 | - | - | - | - |
#X-ARRAY4 |
1 | 拡張可能 | 1 | 5 | - | - |
#X-ARRAY5 |
拡張可能 | 10 | - | - | - | - |
#X-ARRAY6 |
1 | 10 | 100 | 拡張可能 | 拡張可能 | 1000 |
#ARRAY2(I4/10) /* a one-dimensional array with 10 occurrences (1:10) #X-ARRAY4(I4/*,1:5) /* a two-dimensional array #X-ARRAY6(I4/1:10,100:*,*:1000) /* a three-dimensional array
パラメータデータエリアには、可変オカレンス数を含む配列を指定できます。この指定は、インデックス表記 1:V
を使用して行います。
例 1:#ARR01 (A5/1:V)
例 2:#ARR02 (I2/1:V,1:V)
変数インデックス表記 1:V
を含むパラメータ配列は、次の長さでのみ再定義できます。
例えば、次のように 1:V
インデックスが右端の場合は、そのエレメンタリフィールドの長さになります。
#ARR(A6/1:V)
は、最大 6 バイトまでの長さで再定義できます。
#ARR(A6/1:2,1:V)
は、最大 6 バイトまでの長さで再定義できます。
#ARR(A6/1:2,1:3,1:V)
は、最大 6 バイトまでの長さで再定義できます。
右端の固定オカレンス数とエレメンタリフィールドの長さの積は、例えば次のようになります。
#ARR(A6/1:V,1:2)
は、最大 2 x 6 = 12 バイトまでの長さで再定義できます。
#ARR(A6/1:V,1:3,1:2)
は、最大 3 x 2 x 6 = 36 バイトまでの長さで再定義できます。
#ARR(A6/1:2,1:V,1:3)
は、最大 3 x 6 = 18 バイトまでの長さで再定義できます。
変数インデックス表記 1:V
は、再定義の中では使用できません。
例:
DEFINE DATA PARAMETER 1 #ARR(A6/1:V) 1 REDEFINE #ARR 2 #R-ARR(A1/1:V) /* (1:V) is not allowed in a REDEFINE block END-DEFINE
オカレンス数はコンパイル時には不明であるため、ステートメント INPUT
、WRITE
、READ WORK FILE
、および WRITE WORK FILE
でインデックス表記 (*) を使用してオカレンス数を参照することはできません。インデックス表記 (*) は、すべての次元に適用されるか、またはどの次元にも適用されないかのいずれかになります。
有効な例:
#ARR01 (*) #ARR02 (*,*) #ARR01 (1) #ARR02 (5,#FIELDX) #ARR02 (1,1:3)
無効な例:
#ARRAYY (1,*) /* not allowed
ラインタイムエラーを回避するために、このような配列の最大オカレンス数は、別のパラメータを経由してサブプログラム、サブルーチンまたは関数に渡す必要があります。代わりに、システム変数 *OCCURRENCE
を使用することもできます。
注意:
1:V
を含むパラメータデータエリアを使用する場合(つまり、DEFINE DATA LOCAL
ステートメントで指定した場合)は、V
という名前の変数を CONSTANT
として定義する必要があります。
1:V
を BY
VALUE
と一緒に使用することはできません。