形状明示配列は,配列の各次元の境界に対して明示的な値を指定して宣言されます。形状明示指定は次の形式を取ります。
([dl:] du[, [dl:] du]...)
dl
次元の下限を示す宣言式。式の値は正,負,またはゼロです。必要ならば,値は整数型に変換されます。
下限が指定されていない場合,値 1 が使用されます。
du
次元の上限を示す宣言式。式の値は正,負,またはゼロです。必要ならば,値は整数型に変換されます。
境界は,以下に示すように,定数式または非定数式として指定することができます。
境界が定数式である場合,特定の次元内の配列の添字範囲は,下限と上限の間の (下限と上限の両方を含んだ) 整数値の組となります。下限が上限よりも大きい場合,範囲は空となり,その次元での寸法はゼロになり,配列の大きさはゼロになります。
境界は,手続の実行中に行われる宣言式中の変数の再定義または定義解除の影響は受けません。
以下の形状明示配列は,非定数の境界を指定することができます。
以下に形状明示配列指定例を示します。
INTEGER I(3:8, -2:5) ! 次元数 2 の配列,次元 1 の範囲は 3 から 8, ... ! 次元 2 の範囲は -2 から 5 SUBROUTINE SUB(A, B, C) INTEGER :: B, C REAL, DIMENSION(B:C) :: A ! 次元数 1 の配列,範囲は B から C
以下の例を考えます。
INTEGER M(10, 10, 10) INTEGER K(-3:6, 4:13, 0:9)
M と K は,両方とも 3 次元,大きさ 1000,同じ形状 (10, 10, 10) を持つ形状明示配列です。配列 M は,各次元に対して基本下限値 1 を使います。そのため,これを宣言する場合,上限値のみを指定する必要があります。配列 K の各次元は,基本値ではない下限値を持っており,上限値と同様に下限値を宣言しています。
自動割付け配列は,局所変数である形状明示配列です。自動割付け配列は関数とサブルーチン副プログラムの中でのみ許され,副プログラムの宣言部で宣言されます。自動割付け配列では,少なくとも 1 つの境界が,非定数の宣言式でなくてはなりません。境界は副プログラムの呼び出し時に決定されます。
次の例は自動割付け配列を示しています。
SUBROUTINE SUB1 (A, B) INTEGER A, B, LOWER COMMON /BOUND/ LOWER ... INTEGER AUTO_ARRAY1(B) ... INTEGER AUTO_ARRAY2(LOWER:B) ... INTEGER AUTO_ARRAY3(20, B*A/2) END SUBROUTINE
以下の例を考えます。
SUBROUTINE EXAMPLE (N, R1, R2) DIMENSION A (N, 5), B(10*N) ... N = IFIX(R1) + IFIX(R2)
サブルーチンが呼び出されると,配列 A と B は渡される変数 N の値でサブルーチン内で次元が取られます。後で,N の値が変更されても,配列 A と B の次元には影響は及びません。
整合配列は,副プログラムへの仮引数である形状明示配列です。整合配列では,少なくとも 1 つの境界が,非定数の宣言式でなくてはなりません。境界は副プログラムの呼び出し時に決定されます。
配列指定は,仮引数,または共通ブロック中の変数である整数変数を含むことができます。
副プログラムに入ったとき,境界に指定されているすべての仮引数が実引数に結合されていなくてはなりません。指定が共通ブロック中の変数を含んでいる場合,その変数は定義済みの値を持っていなくてはなりません。配列指定は,実引数の値と,指定に現れるすべての定数または共通ブロック変数を使って評価されます。
整合配列の大きさは,対応する実引数である配列の大きさ以下でなくてはなりません。
添字の評価でエラーが起こる可能性をなくすために,多次元整合配列の宣言に使用される境界式が,呼び出し側によって宣言されている境界に一致していることを確認するようにしてください。
次の例では,関数は次元数 2 の配列の要素の総和を計算しています。仮引数 M と N が繰返しを制御していることに注目してください。
FUNCTION THE_SUM(A, M, N) DIMENSION A(M, N) SUMX = 0.0 DO J = 1, N DO I = 1, M SUMX = SUMX + A(I, J) END DO END DO THE_SUM = SUMX END FUNCTION
以下に THE_SUM の呼び出しの例を示します。
DIMENSION A1(10,35), A2(3,56) SUM1 = THE_SUM(A1,10,35) SUM2 = THE_SUM(A2,3,56)
次の例は,手続に入るときに決定される配列境界が,実行中は変化しないことを示しています。
DIMENSION ARRAY(9,5) L = 9 M = 5 CALL SUB(ARRAY,L,M) END SUBROUTINE SUB(X,I,J) DIMENSION X(-I/2:I/2,J) X(I/2,J) = 999 J = 1 I = 2 END
I と J への代入は,サブルーチン SUB に入ったときに X(-4:4,5) として宣言される整合配列 X の宣言には影響を与えません。
関連情報
宣言式の詳細については,「宣言式」を参照してください。