4

したがって、サンプルループ:

do i=1,1
    print *,i
enddo
print *,i

2の最終値として私を与えますi。WindowsでIntelFortranfor Visual Studioをセットアップして、の最終値を取得するにはどうすればよい1ですiか?

4

2 に答える 2

8

これは、Fortran ループが何十年も機能する方法であり、コンパイラ オプションでこれを単純に変更することはできません。Fortran 標準では、次のように明確に述べられています。

8.1.4.4.1 ループの開始

(2) DO変数は、初期パラメータm 1の値で定義されます。

(3)反復回数が確立され、式の値になります MAX (INT ((m2 – m1 + m3) / m3), 0)

ここで、 m 1m 2、およびm 3はloop-control :の 3 つのパラメーターです( m 3は省略された場合は暗黙的に指定され[,] var = m1,m2[,m3]ます) の例を考えると、反復カウントはに評価されます。つまり、ループは 1 回実行されます。(2) に従って初期化されます。i=1,11MAX(INT((1-1+1)/1),0)1i1

8.1.4.4.2 実行サイクル

DO コンストラクトの実行サイクルは、終了するまで順番に繰り返し実行される次のステップで構成されます。

(1) 反復回数があれば、それがテストされます。反復カウントがゼロの場合、ループは終了し、DO 構造は非アクティブになります。loop-controlがの場合[ , ] WHILE (scalar-logical-expr)scalar-logicalexprが評価されます。この式の値が false の場合、ループは終了し、DO 構造は非アクティブになります。その結果、do-term-shared-stmtを共有するすべての DO 構造が非アクティブである場合、これらすべての構造の実行が完了します。ただし、do-term-shared-stmtを共有する DO 構文の一部がアクティブな場合、DO ステートメントが最後に実行されたアクティブな DO 構文の実行サイクルのステップ (3) から実行が続行されます。

Fortranは、DO 変数が終了値より小さい (より大きい) かどうかではなく、残りの反復回数が 0 より大きいかどうかをテストします。

(2) 反復回数がゼロ以外の場合、ループの範囲が実行されます。

(3) 反復回数があれば、それを 1 減らします。もしあれば、DO変数は増分パラメータの値だけ増分される。

DO 変数は、ループの反復が実行されるたびにインクリメントされます。したがって、最初の実行後、iによってインクリメントされ1、評価結果は になります2

手順 (3) で発生する DO 変数のインクリメントを除き、DO 構文がアクティブな間は、DO 変数を再定義したり、未定義にしたりしてはなりません。

8.1.4.4.4 ループの終了

DO 構文が非アクティブになると、DO 構文の DO 変数が存在する場合は、最後に定義された値が保持されます。

最後に定義された値は2です。したがって、DO ループが終了した後は、iと等しくなり2ます。

ISO/IEC 1539:1991 (別名 Fortran 90) からテキストを取り出しましたが、ISO/IEC 1539:1980 の §11.10.3 (別名 ANSI X3J3/90.4 別名 FORTRAN 77) でもほとんど同じテキストを見つけることができます。 ; WHILEF77 に存在しないものはなく、ISO/IEC 1539-1:2010 (別名 Fortran 2008) の §8.1.6.6 にもありません。

于 2012-08-09T11:46:11.137 に答える
4

それが DO のしくみなので、できません。制御変数が制限を超えると停止します。

一般に、FOR/DO カウント ループを使用するほとんどすべての言語では、ループ制御変数はループ本体内でのみ使用し、他の場所では未定義として扱う必要があります。実際にそのスコープを本体に限定できない場合でも同様です。

あなたの場合、別の変数を使用して、反復における i の実際の最後の値を追跡します。

lasti = 0
do i=1,1
   print *,i
   lasti = i
enddo
print *,lasti
于 2012-08-08T23:03:26.547 に答える