fortran 90 の MODULE 内の変数の扱いがコンパイラによって異なっていた件について
日頃、利用している2種の fortran コンパイラ(g95と日立)で動作が異なっていたのでメモ。ミニマルのサンプルソースコードは下記。g95では sub() の動作の冒頭では b の値が不定(演算時にゼロを代入している)だが、日立では初期にゼロ, 2回目の呼出では前回の値を保持しており、SAVE属性が勝手についている動作だった。g95でも宣言部分(CONTAINSの前)に b の宣言を書くと、値を保持した。ローカルな捨て変数でも初期化をきちんと書くと安全。SAVE属性が付いたような動作だが、PROGRAM 側から変数の値は見えなかった。
MODULE mod IMPLICIT REAL(8) (a-h,o-z), INTEGER(i-n) CONTAINS SUBROUTINE sub (a) REAL(8)::a,b PRINT * ,'sub() ' ,b b= b + a a= a + b END SUBROUTINE END MODULE PROGRAM main USE mod IMPLICIT REAL(8) (a-h,o-z), INTEGER(i-n) REAL(8):: c= 1.D0 CALL sub(c) PRINT * ,'main()' ,c ,b ! b は見えるかな CALL sub(c) PRINT * ,'main()' ,c END PROGRAM