形状無指定指定

形状無指定配列は,配列ポインタまたは割付け配列です。

配列指定は,配列の各次元について 1 つのコロン (:) を含んでいます。境界は指定されません。割付け配列と配列ポインタの境界 (および形状) は,プログラムの実行中に,その配列の空間が割り付けられた時点で決定されます。

配列ポインタPOINTER 属性で宣言された配列です。その境界と形状は,ポインタ代入によって指示先に結合されたとき,または ALLOCATE 文の実行によってポインタが割り付けられたときに決定されます。

ポインタ代入では,配列ポインタの各次元の下限は,指示先の対応する次元に LBOUND 組込み関数を適用した結果となります。各次元の上限は,指示先の対応する次元に UBOUND 組込み関数を適用した結果となります。

ポインタ仮引数はポインタ実引数にしか結合されません。ポインタである実引数は非ポインタ仮引数に結合することができます。

関数結果はポインタ属性を持つものとして宣言することができます。

割付け配列は,ALLOCATABLE 属性で宣言されます。その境界と形状は,配列が ALLOCATE 文の実行によって割り付けられた時点で決定されます。

以下に形状無指定の例を示します。

	REAL, ALLOCATABLE :: A(:,:)		! 割付け配列
	REAL, POINTER :: C(:), D (:,:,:)	! 配列ポインタ

形状無指定配列が DIMENSION または TARGET 文で宣言された場合,他の文で ALLOCATABLE または POINTER 属性をこれに与えなければなりません。以下に例を示します。

	DIMENSION P(:, :, :)
	POINTER P

	TARGET B(:,:)
	ALLOCATABLE B

形状無指定配列がポインタの配列である場合,その大きさ,形状,境界は ALLOCATE 文またはポインタが割り当てられた指示先に結合される時にポインタ代入文で設定されます。ポインタと指示先は,同じ次元を持たなければなりません。以下に例を示します。

	REAL, POINTER :: A(:,:), B(:), C(:,:)
	INTEGER, ALLOCATABLE :: I(:)
	REAL, ALLOCATABLE, TARGET :: D(:, :), E(:)
	...
	ALLOCATE (A(2, 3), I(5), D(SIZE(I), 12), E(98) )
	C => D		! ポインタ代入文
	B => E(25:56)	! ポインタを指示先のセクションに代入

関連情報