割付け配列の境界 (および形状) は,割付け時に決定されます。それ以降,境界式に含まれる言語要素が再定義されたり,定義が取り消されても,配列宣言には影響は及びません。
下限が上限よりも大きい場合,その次元の寸法はゼロになり,配列の大きさはゼロになります。下限が省略された場合,値 1 が使用されます。
割り付けられた配列は確定可能となります。すでに割り付けられている割付け配列を割り付けると,エラーが発生します。
組込み関数 ALLOCATED を使うと,割付け配列がすでに割り付けられているかどうかを調べることができます。
REAL, ALLOCATABLE :: E(:,:) ... IF (.NOT. ALLOCATED(E)) ALLOCATE(E(2:4,7))
割付け状態
プログラムの実行中,割付け配列の割付け状態は次のどちらかになります。
配列は 1 回も割り付けられていないか,最後の操作として割付け解除が行われています。このような配列は,引用も定義もできません。
配列は ALLOCATE 文によって割り付けられています。このような配列は,引用,定義,または割付け解除を行うことができます。
割付け配列が SAVE 属性を持っている場合,初期状態は「割り付けられていない」となります。その後,配列が割り付けられると,状態は「割り付けられている」になります。この状態は割付け解除されるまで続きます。
割付け配列が SAVE 属性を持たない場合,手続の呼び出しが行われるたびに,その状態は初期状態として「割り付けられていない」となります。配列の状態が「割り付けられている」に変わった場合,手続が RETURN または END 文の実行によって終了した時点で,配列は割付け解除されます。
例
以下の例は,仮想メモリー割付けを行うプログラムを示しています。このプログラムは,オペレーティング・システムのメモリー割付けルーチンを呼び出す代わりに,Fortran 95/90 標準の文を使用しています。
仮想メモリーの割付け
! プログラムは整数値を受け取り,平方根値を表示します。 INTEGER(4) :: N READ (5,*) N ! 整数値を読みます。 CALL MAT(N) END ! サブルーチン MAT は,1 から N (読み込んだ数字) の ! 数字の平方根値を表示するために整数型を使用します。 SUBROUTINE MAT(N) REAL(4), ALLOCATABLE :: SQR(:) ! 1 次元割付け配列として ! SQR を宣言します。 ALLOCATE (SQR(N)) ! 配列 SQR を割り付けます。 DO J=1,N SQR(J) = SQRT(FLOATJ(J)) ! FLOATJ は整数を実数に変換します。 ENDDO WRITE (6,*) SQR ! 計算結果を表示します。 DEALLOCATE (SQR) ! 配列 SQR の割付け解除します。 END SUBROUTINE MAT
関連情報