您的问题可能是由于编译器之间的差异而不是机器的位级别之间的差异。例如,某些 FORTRAN 77 编译器隐式应用于save
所有过程(子例程和函数)局部变量。这不是标准要求的,不应依赖此行为。当使用现代编译器编译遗留程序时,它经常会导致问题,save
如果局部变量应该在过程的调用中保留其值,则需要使用该编译器。不知道g77有没有这个“功能”。您可以使用编译器选项在 gfortran 中打开此行为-fno-automatic
。
编辑:考虑:
subroutine MySub
logical FirstCall
save FirstCall
data FirstCall / .TRUE. /
integer I
if ( FirstCall ) then
I = 0
FirstCall = .FALSE.
end if
I = I + 1
write (6, *) "Call", I
end
program main
integer j
do j=1, 4
call MySub ()
end do
end program main
使用 g77 编译(无编译器选项),输出为:
Call 1
Call 2
Call 3
Call 4
局部变量I
在调用MySub
. 所以看起来 g77 正在保存局部变量,即使没有使用save
. 至少在默认优化级别。
使用带有选项fbackslash -ffixed-line-length-0 -std=legacy -g -O0 -fno-inline
的 gfortran 编译,输出是相同的。现在更改为-O3
,输出为:
Call 1
Call 2
Call 3
Call 129
有时I
保留其价值,有时则不保留。
将程序的一行更改为:save FirstCall, I
并且始终保留该值:
Call 1
Call 2
Call 3
Call 4
试-fno-automatic
...