3

Fortran 関数の 1 つで 1 つの変数を初期化しました。別の機能で使用しています。しかし、値は同じままではありません。他の関数呼び出しでは、ガベージ値を取得しています。初期化された値を維持するにはどうすればよいですか。

元:

エントリ a()
コール数=0

エントリ b()
コール数 = コール数 + 1

エントリ「b」から、ゴミとして num_calls を取得しています

4

4 に答える 4

5

従来の Fortran (Fortran 77 以前) では、num_calls が共通ブロック (おそらく名前付き共通ブロック) で定義されていることを確認します。

COMMON /magic/ num_calls

私は Fortran 90 を使ったことがないので、どのような追加機能があるのか​​わかりません。下位互換性のために名前付き共通ブロックを保持している可能性がありますが、より優れたものも提供する可能性があります。

私もごまかして、変数の暗黙の宣言を使用しました。完全に、私は書くべきです:

INTEGER*4 num_calls
COMMON /magic/ num_calls
于 2009-07-21T06:59:06.237 に答える
4

FORTRAN 77の場合、Jonathan Lefflerの方法が機能します。彼が指摘しているように、Fortran90以降もCOMMONブロックをサポートしています。ただし、Fortran 90 / Fortran 2003コンパイラーにアクセスできるので、ブロックを使用する理由はありません。計算されたおよび。COMMONとともに、それらを履歴のゴミ箱に残してください。GOTOENTRY

関連する変数(および関数)のグループを格納するためのFortran 90メソッドは、もはやCOMMONブロックではなく、MODULEです。コードの場合、これは比較的簡単です。

module count_calls

    integer :: num_calls = 0

end module count_calls

次に、num_callsを使用するサブルーチンに、次のように追加します。

use count_calls

サブルーチン自体またはそれを含むスコープ(つまり、aprogramまたはanother module)のいずれかに。

于 2009-07-21T15:53:59.127 に答える
1

「保存」属性を使用して変数を宣言する必要があります。そうすれば、変数は呼び出し間で存続します。古いコンパイラはデフォルトで、または最適化レベルに応じてこれを行っていたため、すべての変数を「保存」としてマークするコンパイラ オプションがあります。

    integer*4, save :: num_calls

ローカル変数がスコープ外になると未定義になるのは、ほとんどの言語の標準機能です。

于 2011-09-08T22:38:53.587 に答える
1

num_callsどちらのサブルーチンの外側でも宣言して、その存続期間がどちらのサブルーチン呼び出しとも無関係になるようにする必要があります。実際にFORTRANを話す人がサンプルコードを提供できます...

于 2009-07-21T06:50:08.173 に答える