WHERE

文と構文:選択された要素に対して配列演算を行う配列選別代入を実行することができます。この種の代入は,配列に対して要素ごとの論理的検証を適用します。

形式

WHERE (mask-expr1) assign-stmt

構文

[name:] WHERE (mask-expr1)

[where-body-stmt]...
[ELSEWHERE (mask-expr2) [name]
[where-body-stmt]...]
[ELSEWHERE [name]
[where-body-stmt]...]
END WHERE [name]

mask-expr1, mask-expr2
論理配列式 (選別式と呼ばれます)。

assign-stmt
「配列変数 = 配列式」という形式の代入文。

name
WHERE 構文の名前。

where-body-stmt
次のいずれか。

規則と振る舞い

WHERE 文で構文名が宣言されている場合,対応する END WHERE 文に同じ名前が存在していなくてはなりません。省略可能なものとして,その構文中の任意の ELSEWHERE 文で同じ構文名を使用することができます (ELSEWHERE で別の名前を宣言することはできません)。

個々の代入文,選別式,代入先の変数,および右辺の式は,すべて形状適合でなくてはなりません。また,代入文はユーザー定義代入であってはなりません。

飛び先文として文番号を付けることができるのは,WHERE 文 (または WHERE 構文の最初の行) だけです。

次に WHERE 文の例を示します。

	INTEGER A, B, C
	DIMENSION A(5), B(5), C(5)
	DATA A /0,1,1,1,0/
	DATA B /10,11,12,13,14/
	C = -1

	WHERE(A .NE. 0) C = B / A

結果として得られる配列 C は次の要素を含んでいます。

-1,11,12,13,-1

代入文は選別式が真になる要素に対してのみ実行されます。選別式は,まず A が正である要素について真の値を持つ論理配列に評価されると考えることができます。この真と偽の値を含んでいる配列が,代入文中の配列 AB,および C に適用されます。右辺は,選別式が真である要素についてのみ評価されます。左辺への代入は,選別式が真である要素についてのみ実行されます。選別式が偽である要素には,値は代入されません。

WHERE 構文では,選別式は最初に 1 回だけ評価されます。WHERE の後に続く個々の代入文は,"mask-expr" を持つ WHERE 文であるかのように実行され,ELSEWHERE の後に続く個々の代入文は,".NOT. mask-expr1" を持つ WHERE 文であるかのように実行されます。ELSEWHERE"mask-expr2" を宣言している場合,"(.NOT. mask-expr1) .AND. mask-expr2" として実行されます。

文が副作用を持つ場合,または互いに,あるいは選別式を変更する場合,注意する必要があります。

次に WHERE 構文の例を示します。

	DIMENSION PRESSURE(1000), TEMP(1000), PRECIPITATION(1000)
	WHERE(PRESSURE .GE. 1.0)
	  PRESSURE = PRESSURE + 1.0
	  TEMP = TEMP - 10.0
	ELSEWHERE
	  PRECIPITATION = .TRUE.
	ENDWHERE

代入の右辺の関数が要素別処理関数として見なされるのであれば,選別式がその関数の引数に適用されます。要素別処理関数として見なされるのは要素別処理組込み関数だけです。変形組込み関数,問合せ組込み関数,および副プログラム中で定義されている関数または演算は,非要素別処理関数と見なされます。

次に,要素別処理関数 LOG を使った例を示します。

	WHERE(A .GT. 0)  B = LOG(A)

選別式が A に適用され,LOGA の正の値に対してのみ実行されます。LOG の結果が,選別式が真である場合にのみ B の要素に代入されます。

次に,非要素別処理関数 SUM を使った例を示します。

	REAL A, B
	DIMENSION A(10,10), B(10)
	WHERE(B .GT. 0.0)  B = SUM(A, DIM=1)

SUM は非要素別処理関数なので,A のすべての要素に対して完全に評価されます。その後,選別式が真と評価された要素に対してのみ代入が行われます。

次の例を考えます。

	REAL A, B, C
	DIMENSION A(10,10), B(10), C(10)
	WHERE(C .GT. 0.0)  B = SUM(LOG(A), DIM=1)/C

SUM は非要素別処理関数なので,すべての引数が,それらが要素であるかどうかにかかわらず完全に評価されます。この例では,LOG が要素別処理関数であるにもかかわらず,LOG(A)A 中のすべての要素に対して完全に評価されます。右辺を決定する際に,選別式が SUM の結果と C に適用されることに注意してください。これは,非要素別処理関数の引数並びの内側のものはすべて選別式を使用せず,外側のものはすべて選別式を使用するというふうに理解することもできます。

互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

FORALL配列

	REAL(4) a(20)
	. . .
	WHERE (a > 0.0)
	  a = LOG (a)
	  ! LOG は,正の要素に対してのみ呼び出されます
	END WHERE