2009-07-21 5 views
3

私は、Fortran関数の1つで1つの変数を初期化しました。私は別の機能でそれを使用しています。しかし、その価値は変わらない。他の関数呼び出しでは、私はゴミ値を取得しています。どのように私は初期化された値を維持するのですか?Fortran可変スコープでの問題

例:

 
entry a() 
num_calls=0 

entry b() 
num_calls= num_calls + 1 

エントリ「B」私はあなたは、その寿命は、サブルーチンコールのどちらかには無関係であるように、いずれかのサブルーチンのnum_calls外を宣言する必要があるいくつかのゴミ

+0

num_callsはローカルスコープかグローバルスコープですか? – outis

答えて

1

としてnum_callsを取得していますから。実際にFORTRANを話す人は、いくつかのサンプルコードを提供できます。

5

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

COMMON /magic/ num_calls 

私はFortran 90を使用していないため、どのような余分な機能があるのか​​わかりません。下位互換性のために名前付きの共通ブロックを保持している可能性がありますが、おそらくより良いものもあります。

私も気になって、変数の暗黙的な宣言を使用しました。フルでは、私が書く必要があります:FORTRAN 77の場合

INTEGER*4 num_calls 
COMMON /magic/ num_calls 
4

を、ジョナサン・レフラーのメソッドは動作します - 彼が指摘するように、Fortran 90の以降もCOMMONブロックをサポートしています。しかし、Fortran 90/Fortran 2003コンパイラにアクセスできるので、COMMONブロックを使用する理由はありません。ヒストリのヒープヒープに、計算されたGOTOENTRYのままにしておきます。

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

module count_calls 

    integer :: num_calls = 0 

end module count_calls 

その後、あなたはnum_callsを使用したいあなたのサブルーチンでは、サブルーチン自身または含む範囲(すなわちprogramのいずれかに

use count_calls 

を追加したり、別のmodule)。

1

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

integer*4, save :: num_calls 

ほとんどの言語の標準機能で、ローカル変数は範囲外になると未定義になります。

+0

しかし、ほとんどの歴史的なFORTRANコンパイラは、スタック上ではなく静的な領域にローカルを割り当て、セーブステートメントをオプションにして悪い習慣を奨励しています... –

関連する問題