Fortran 90 骨の髄まで | ←REAL関数の落とし穴 | 自動割り付けデータ・オブジェクトの落とし穴 → |
C言語から入った人がことごとく失敗するという伝説の仕様をお見せします。
まず、以下のようなサブルーチンを用意します。
subroutine foo integer :: a = 0 a = a + 1 print *, a end subroutine
このサブルーチンを呼び出すとどうなるでしょうか。
1が出力されると思った人はまだまだ甘いです。
というわけでこのサブルーチンを3回呼び出すプログラムを作ってみます。
program test call foo call foo call foo end program
このプログラムの出力は以下のようになります。
1 2 3
驚いて頂けたでしょうか。
なぜこんな出力になってしまうのでしょう。
それは次のような仕様があるからです。すなわち、
変数の定義のところで初期化すると、その変数に自動的にSAVE属性がつきます。
つまり、2回目以降の呼び出しでは変数を初期化してくれないのです。
私としてはかなり衝撃的で、最初はコンパイラの誤りかとさえ思いましたが、これが正しい仕様です。
SAVE属性なしで初期化したいなら次のようなプログラムにすれば間違いないです。
subroutine foo integer :: a a = 0 a = a + 1 print *, a end subroutine
出力
1 1 1
これで予定通りの出力が得られました。
![]() |
←REAL関数の落とし穴 | 自動割り付けデータ・オブジェクトの落とし穴 → |