ナビゲーション:前へ 上へ 次へ
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文の改訂された構文は、文番号と構文名を無視して、以下の通りです:
ここでconcurrent-headerは以前と同じで、各locality-specは以下のいずれかです:DO CONCURRENTconcurrent-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
