ナビゲーション:前へ 上へ 次へ
11.5 実行制御
-
[6.2]
ERRORSTOP
またはSTOP
文の式は非定数である可能性があります。 しかし、その場合でも基本整数または基本文字である必要があります。 -
[6.2]
ERRORSTOP
およびSTOP
文に、省略可能なQUIET=
指定子が追加されました。 これを指定する場合、指定子の前に省略可能な終了符号とカンマを指定します。QUIET=
指定子は論理式を取り、これが実行時に真の場合、STOP
(またはERRORSTOP
)はメッセージを出力せず、IEEEの例外通知に関する情報は抑止されます。
例)STOP 13, QUIET = .True.
上記の例では通常の‘STOP: 13’は表示されずプロセスの終了ステータスが13の終了が行われます。 これは、次の2つのステートメントが同等であることを意味します。STOP, QUIET=.True. STOP 'message not output', QUIET=.TRUE.
-
[7.2]
算術
IF
文は削除されました。これは、式がIEEE 非数(NaN)の場合の振る舞いが未定義であり、 良い定義を持つことができないためです。 それでもなお、nAG Fortranコンパイラには残っていますが、削除された機能として報告されます。 例えば、ファイルdel.f90
に以下が含まれている場合、Subroutine sub(x) Real,Intent(In) :: x If (x) 1,2,3 1 Stop 1 2 Stop 2 3 Stop 3 End Subroutine
以下の警告メッセージが生成されます:Deleted feature used: del.f90, line 3: Arithmetic IF statement
-
[7.2]
DO CONCURRENT
構文は、局所性指定子LOCAL
、LOCAL_INIT
、およびSHARED
を持つことができます。 これらの局所性指定子は、変数がループ内外でどのように使用できるかを決定し、ループインデックス変数には適用できません。これらは常に効果的にLOCAL
です。 また、DEFAULT(NONE)
局所性指定子もあり、DO CONCURRENT
で使用されるすべての変数に明示的な局所性を与える必要があります。DO CONCURRENT
文の改訂された構文は、文番号と構文名を無視して、以下の通りです:DO CONCURRENT
concurrent-header [ locality-spec ]...LOCAL (
variable-name-list)
LOCAL_INIT (
variable-name-list)
SHARED (
variable-name-list)
DEFAULT (NONE)
LOCAL
またはLOCAL_INIT
指定子に現れる変数は、比較的普通の変数でなければなりません: つまりALLOCATABLE
やOPTIONAL
属性を持ってはならず、割付け可能な末端成分を持ってはならず、共配列や大きさ引継ぎ配列であってはなりません。 多相的である場合、POINTER
属性を持っていなければなりません。 最終的に、変数定義コンテキストで現れることが許されていなければなりません:例えば、INTENT(IN)
であってはなりません。LOCAL
とLOCAL_INIT
の効果は、構文内の変数が構文外の変数と完全に別であることです。もしLOCAL
ならば、それは各イテレーションを未定義で始め、もしLOCAL_INIT
ならば、それは各イテレーションを外側の変数の値で始めます。 これにより、LOCAL
およびLOCAL_INIT
変数がイテレーション間の依存関係を引き起こすことができないことを保証します。SHARED
である変数は、構文内外で同じ変数です。 もし任意のイテレーションによって値が与えられた場合、他のイテレーションによって参照されたり値が与えられたりしてはなりません。 もし割付け可能であるかポインタである場合、同様に単一のイテレーションによってのみ割付けられ、解放され、またはポインタ割り当てが行われなければなりません。 不連続な配列がSHARED
である場合、それは連続した仮引数に実引数として渡されてはなりません(つまり、仮引数は形状引継ぎであるかポインタでなければならず、CONTIGUOUS
属性を持ってはなりません)。 -
[7.2]
文番号付きの
DO
構文は廃止予定とされています (これはEND DO
文と構文文番号によって実質的に置き換えられています)。 さらに、非ブロックDO
構文は削除されました(しかし、nAG Fortranコンパイラには残っており、削除された機能として報告されています)。 非ブロックDO
は、共有DO
終了文番号を持つ2つ以上のネストされたDO
ループ、またはEND DO
やCONTINUE
以外の終了文を持つDO
ループのいずれかです。 (これらは理解が難しく、エラーを起こしやすいため、またFortran 90以降ブロックDO
構文を通じてより良い機能が利用可能になっているため、廃止予定/削除されています。) 例えば、ファイルobsdel.f90
に以下が含まれている場合、Subroutine sub(w,x,y) Real,Intent(InOut) :: w(:),x(:,:), y(:) Integer i,j Do 100 i=1,Size(w) w(i) = w(i)**2 + 4*w(i) - 4 100 Continue Do 200 j=1,Size(x,2) Do 200 i=1,Size(x,1) If (x(i,j)<0) Go To 200 x(i,j) = Sqrt(x(i,j)+1) 200 Continue Do 300 i=1,Size(y) If (y(i)<0) Go To 300 y(i) = Log(y(i)) 300 Print *,y(i) End Subroutine
これらの警告メッセージが生成されます:Obsolescent: obsdel.f90, line 4: DO statement with label (100) Obsolescent: obsdel.f90, line 7: DO statement with label (200) Obsolescent: obsdel.f90, line 8: DO statement with label (200) Deleted feature used: obsdel.f90, line 11: 200 is a shared DO termination label Obsolescent: obsdel.f90, line 12: DO statement with label (300) Deleted feature used: obsdel.f90, line 15: DO 300 ends neither with CONTINUE nor ENDDO
-
[7.2]
FORALL
文と構文は廃止予定とされています。 これは、通常、普通のDO
やDO CONCURRENT
よりも性能が悪いためです。 例えば、ファイルobs.f90
に以下が含まれている場合、Subroutine sub(a,b,c) Real,Intent(InOut) :: a(:) Real,Intent(In) :: b(:),c Integer i Forall(i=1:Size(a)) a(i) = b(i)**2 - c End Forall End Subroutine
以下の警告メッセージが生成されます:Obsolescent: obs.f90, line 5: FORALL construct