トップ > Fortran >
REAL関数の落とし穴 | 自動割り付けデータ・オブジェクトの落とし穴

13-6. 初期化付き宣言の落とし穴

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関数の落とし穴 | 自動割り付けデータ・オブジェクトの落とし穴