配列構成子

配列構成子は次元数 1 の配列 (および配列定数) を作成したり,これに値を代入するために使用することができます。配列構成子は次の形式を取ります。

(/ac-value-list/)

ac-value-list
1 つまたは複数の式並び,または DO 形反復。個々の ac-value は同じ型と種別パラメタを持ち,コンマで区切られていなくてはなりません。

配列構成子中の DO 形反復は次の形式を取ります。

(ac-value-list, do-variable = expr1, expr2 [,expr3])

do-variable
スカラ整数型変数の名前。その有効範囲は DO 形反復の有効範囲です。

expr
スカラ整数式。expr1expr2 は反復値の範囲を宣言します。expr3 は刻み幅を宣言します。expr3 はゼロ以外の値でなくてはなりません。これが省略された場合,値 1 が使用されます。

規則と振る舞い

作成された配列は,ac-value-list 式と同じ型を持ちます。

配列構成子によって宣言された値の列が空である場合 (式がない,または DO 形反復が値を生成しない場合),次元数 1 の配列の大きさはゼロになります。

ac-value は次のように解釈されます。

ac-value
の形式
結果
スカラ式 その値は,新しい配列の要素です。
配列式 式中の要素値 (配列要素順) が,新しい配列中の対応する要素列となります。
DO 形反復 ループが展開され,(DO 構文と同じように) DO 変数の制御下で配列要素の並びが生成されます。

以下に,ac-value の 3 つの形式を示します。

	C1 = (/4,8,7,6/)		! スカラ式
	C2 = (/B(I, 1:5), B(I:J, 7:9)/)	! 配列式
	C3 = (/(I, I=1, 4)/)		! DO 形反復

これらの形式を混在させることもできます。

	C4 = (/4, A(1:5), (I, I=1, 4), 7/)

配列構成子中のすべての式が定数式である場合,配列構成子は定数式となります。

式が文字型である場合,Fortran 95/90 ではすべての式が同じ文字長でなくてはならないと定められています。

しかし,Compaq Fortran では,文字式が異なる文字長であってもかまいません。結果として得られる文字配列の長さは,個々の文字式の長さの最大値となります。

	print *,len ( (/'a','ab','abc','d'/) )
	print *,'++'//(/'a','ab','abc','d'/)//'--'

この結果として,次の表示が得られます。

	           3
	 ++a  --++ab --++abc--++d  --

DO 形反復が別の DO 形反復に含まれている (入れ子になっている) 場合,これらのループは同じ DO 変数 (do-variable) を持つことはできません。

複数の次元の配列を定義するには,RESHAPE 組込み関数を使用します。

以下に,配列構成子の代替形式を示します。

次の例は,DO 形反復を使った配列構成子を示しています。

	INTEGER ARRAY_C(10)
	ARRAY_C = (/(I, I=30, 48, 2)/)

ARRAY_C の値は,30 ~ 48 の範囲の偶数です。

DO 形反復式と値は,配列構成子の値並びに混在させることができます。以下のようになります。

	INTEGER A(10)
	A = (/1, 0, (I, I = -1, -6, -1), -7, -8 /)
	! 値並びの値と DO 形反復が混在しています。

この例は,A の要素に値を代入します。次の順番で代入されます。

	1, 0, -1, -2, -3, -4, -5, -6, -7, -8

次の例は,構造体構成子を使った構造型の配列構成子を示しています。

	TYPE EMPLOYEE
	  INTEGER ID
	  CHARACTER(LEN=30) NAME
	END TYPE EMPLOYEE

	TYPE(EMPLOYEE) CC_4T(4)
	CC_4T = (/EMPLOYEE(2732,"JONES"), EMPLOYEE(0217,"LEE"),	&
		EMPLOYEE(1889,"RYAN"), EMPLOYEE(4339,"EMERSON")/)

次の例は,RESHAPE 組込み関数を使って多次元配列を作成する方法を示しています。

	E = (/2.3, 4.7, 6.6/)
	D = RESHAPE(SOURCE = (/3.5, (/2.0, 1.0/), E/), SHAPE = (/2,3/))

D は,以下の要素を含む,形状 (2,3) の次元数 2 の配列です。

	3.5    1.0    4.7
	2.0    2.3    6.6

以下に別の例を示します。

	INTEGER B(2,3), C(8)
	! 値を (2,3) 配列に代入します。
	B = RESHAPE((/1, 2, 3, 4, 5, 6/),(/2,3/))
	! ベクトル C に値を代入する前に,
	! B をベクトルに変換します。
	C = (/ 0, RESHAPE(B,(/6/)), 7 /)

関連情報