10.5 実行制御 [大部分 6.0]
-
[5.3]
BLOCK
構文 [5.3]は実行コード部分での宣言を利用可能とします。 例を以下に示します。Do i=1,n Block Real tmp tmp = a(i)**3 If (tmp>b(i)) b(i) = tmp End Block End Do
ここで変数tmp
の有効範囲はBLOCK
構文内に限られ、その外側に影響を及ぼしません。 この機能はINCLUDE
を利用する場合やマクロ処理で特に有用です。BLOCK
内ではCOMMON
,EQUIVALENCE
,IMPLICIT
,INTENT
,NAMELIST
,OPTIONAL
,VALUE
, および文関数以外の全ての宣言が許されています。BLOCK
構文はネストすることが可能です。 他の構文と同様にBLOCK
構文外部から内部への分岐は許されていません。BLOCK
構文内から外部への分岐は、同構文の実行を完了させます。BLOCK
構文内の言語要素でSAVE
属性を持たないものは、同構文が完了した時点で消滅します。 例えば、割付けされたALLOCATABLE
変数は自動的に開放され、FINAL
手続を持つ変数は最終化されます。 -
EXIT
文はDO
構文だけではなくASSOCIATE
、BLOCK
、IF
、SELECT CASE
、SELECT TYPE
の各名前付き構文でも利用可能です。(FORALL
とWHERE
以外の名前付き構文) 構文名を持たないEXIT
文は名前付き構文の有るなしに係らず従来通り最も内側のDO
構文より脱出します。 -
STOP
文で、stop-codeが整数型もしくは基本文字型のどのようなスカラ定数式も指定できるようになりました。 (この変更はPAUSE
文にも適用されていますが、現在ではPAUSE
文はFortran標準ではなくなっています) 更に整数を指定したSTOP
文はプロセスの返却コードとしてその値を返します。 (多くのオペレーティングシステムでは返却コードの制限があるため、nAG Fortranコンパイラでは最下位8ビットの値を返します。) -
ERROR STOP
文が追加されました。 この文はSTOP
と似ていますが、プログラムを(正常終了ではなく)異常終了させます。 書式は最初に記述する‘ERROR
’部分を除きSTOP
文と同等です。 正常終了時のデフォルトのプロセス終了ステータスはゼロですが異常終了の場合は非ゼロとなります。例)
IF (x<=0) ERROR STOP 'x must be positive'
-
[6.1]
FORALL
構文は最初の文で省略可能な型指定子が指定可能です。これにより指標変数の型(INTEGER
でなければならない)と種別が指定可能です。 この指定が行われた場合有効範囲外に存在する(あるいは存在しない)同じ名前を持つ要素は指標変数の影響を全く受けなくなります。 例)Complex i(100) Real x(200) ... Forall (Integer :: i=1:Size(x)) x(i) = i
FORALL
構文は高いパフォーマンスが望まれる場合に推奨されません。 これはこの構文が反復空間と同じ大きさの一時的な配列に右辺評価値を格納した上で変数への代入を行うことに繋がり、 これは一般的に通常DO
ループよりも悪いパフォーマンスになります。 -
[6.1]
DO CONCURRENT
構文は制限付きのDO
ループであり効率的な実行を可能とします。DO CONCURRENT
構文の反復はどのような順序で実行されても良いものです。(並列に行われても良い) ループ指標変数は構文内の局所的なものです。DO CONCURRENT
のヘッダ部分はFORALL
と似ています。 (明示的に反復指標変数の型や種別やスカラ制御配列を指定できる点等)DO CONCURRENT
構文の制限は以下のとおりです。-
構文内から構文外への分岐は許されません。
これには
RETURN
文とSTOP
文が含まれますがERROR STOP
文は含まれません。 -
EXIT
文でループを終了させる事はできません。 -
CYCLE
文は外側ループを参照できません。 - ループ反復間で依存関係があってはなりません。 もしも変数への代入が反復で行われる場合、他の反復でこの変数を参照できません (他の反復でこの変数の参照前に代入を行う場合はこの限りではありません)
- 構文内で参照されるすべての手続きは純粋でなければなりません。
- ループ内に像制御文があってはなりません。
-
IEEE_GET_FLAG
もしくはIEEE_SET_HALTING_MODE
の参照は許されません。
例)
Integer vsub(n) ... Do Concurrent (i=1:n) ! Safe because vsub has no duplicate values. x(vsub(i)) = i End Do
DO CONCURRENT
文の文法は以下のとおりです。[ do-construct-name
ここでforall-headerは:
]DO
[ label ] [,
]CONCURRENT
forall-header(
[ integer-type-spec::
] triplet-spec [,
triplet-spec ]... [,
mask-expr ])
name = expr : expr [ : expr ]
-
構文内から構文外への分岐は許されません。
これには