配列の次元の定義

{[bound:] bound},../graphics/dot3.gif 3

構文図で使用されている記号については、「構文記号」を参照してください。

array-dimension-definition オプションを使用して、配列定義の次元の下限と上限を定義します。

最大 3 次元までの配列を定義することができます。


構文説明

構文要素 説明
bound
下限/上限:

次のいずれかが境界になります。

  • 整数定数

  • 事前に定義された名前付き定数

  • (データベース配列用に)事前に定義されたユーザー定義変数

  • アスタリスク(*)は、拡張可能な境界を定義します。それ以外の場合は、X-array(eXtensible array)として認識されます。

1 つの境界だけを指定した場合、その値は上限を表し、下限は 1 であると想定されます。

X-array

配列の少なくとも 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

オカレンス数はコンパイル時には不明であるため、ステートメント INPUTWRITEREAD WORK FILE、および WRITE WORK FILE でインデックス表記 (*) を使用してオカレンス数を参照することはできません。インデックス表記 (*) は、すべての次元に適用されるか、またはどの次元にも適用されないかのいずれかになります。

有効な例:

#ARR01 (*)
#ARR02 (*,*)
#ARR01 (1)
#ARR02 (5,#FIELDX)
#ARR02 (1,1:3)

無効な例:

#ARRAYY (1,*)  /* not allowed

ラインタイムエラーを回避するために、このような配列の最大オカレンス数は、別のパラメータを経由してサブプログラム、サブルーチンまたは関数に渡す必要があります。代わりに、システム変数 *OCCURRENCE を使用することもできます。

注意:

  1. インデックス 1:V を含むパラメータデータエリアを使用する場合(つまり、DEFINE DATA LOCAL ステートメントで指定した場合)は、V という名前の変数を CONSTANT として定義する必要があります。
  2. ダイアログでは、インデックス 1:VBY VALUE と一緒に使用することはできません。