フォートランのサブルーチンの内部変数
すみません。科学技術系の人間でして、フォートランが現役なのです。
あるプログラムのことですが、サブルーチンの内部の変数についてサブルーチンを呼び出すごとに加算していくようなことを行っています。
do i=1,100
call abc(i) ← サブルーチンabcを100回呼び出す
enddo
end
subroutine abc(i)
n=n+1 ←呼び出されるたびに和をとる。
write(*,*) n
return
end
このようなシンプルなプログラムは問題ないのですが、少し複雑になるとどういうわけか、呼び出される度にnが初期化され、writeさせた結果常に1が表示されるという現象に会いました。
昔のコンパックフォートラン(MS-Fortran, DEC Fortranを継承)と、最近のIntel Fortran(最新版)で動作が異なります。前者では和を取ってくれますが、後者では初期化されて常に1が出力されます。(上記のプログラムは問題なしです。もう少し長いプログラムでの問題です。)
言語仕様の問題(すなわちフォートランのバージョン)なのか、コンパイラ仕様の問題なのか、C言語のように宣言の仕方で変ったりするようになったというようなことはないでしょうか。
以下に示すように和をとる変数をメインプログラム側に一旦見えるようにすると、インテル版でも思ったとおりの動作をします。
call abc(i,n)
suboroutine abc(i,n) としてnをメイン側に露出する。
よろしくお願いします。