Fortran 関数の 1 つで 1 つの変数を初期化しました。別の機能で使用しています。しかし、値は同じままではありません。他の関数呼び出しでは、ガベージ値を取得しています。初期化された値を維持するにはどうすればよいですか。
元:
エントリ a() コール数=0 エントリ b() コール数 = コール数 + 1
エントリ「b」から、ゴミとして num_calls を取得しています
Fortran 関数の 1 つで 1 つの変数を初期化しました。別の機能で使用しています。しかし、値は同じままではありません。他の関数呼び出しでは、ガベージ値を取得しています。初期化された値を維持するにはどうすればよいですか。
元:
エントリ a() コール数=0 エントリ b() コール数 = コール数 + 1
エントリ「b」から、ゴミとして num_calls を取得しています
従来の Fortran (Fortran 77 以前) では、num_calls が共通ブロック (おそらく名前付き共通ブロック) で定義されていることを確認します。
COMMON /magic/ num_calls
私は Fortran 90 を使ったことがないので、どのような追加機能があるのかわかりません。下位互換性のために名前付き共通ブロックを保持している可能性がありますが、より優れたものも提供する可能性があります。
私もごまかして、変数の暗黙の宣言を使用しました。完全に、私は書くべきです:
INTEGER*4 num_calls
COMMON /magic/ num_calls
FORTRAN 77の場合、Jonathan Lefflerの方法が機能します。彼が指摘しているように、Fortran90以降もCOMMON
ブロックをサポートしています。ただし、Fortran 90 / Fortran 2003コンパイラーにアクセスできるので、ブロックを使用する理由はありません。計算されたおよび。COMMON
とともに、それらを履歴のゴミ箱に残してください。GOTO
ENTRY
関連する変数(および関数)のグループを格納するためのFortran 90メソッドは、もはやCOMMON
ブロックではなく、MODULE
です。コードの場合、これは比較的簡単です。
module count_calls
integer :: num_calls = 0
end module count_calls
次に、num_callsを使用するサブルーチンに、次のように追加します。
use count_calls
サブルーチン自体またはそれを含むスコープ(つまり、aprogram
またはanother module
)のいずれかに。
「保存」属性を使用して変数を宣言する必要があります。そうすれば、変数は呼び出し間で存続します。古いコンパイラはデフォルトで、または最適化レベルに応じてこれを行っていたため、すべての変数を「保存」としてマークするコンパイラ オプションがあります。
integer*4, save :: num_calls
ローカル変数がスコープ外になると未定義になるのは、ほとんどの言語の標準機能です。
num_calls
どちらのサブルーチンの外側でも宣言して、その存続期間がどちらのサブルーチン呼び出しとも無関係になるようにする必要があります。実際にFORTRANを話す人がサンプルコードを提供できます...