你的问题很可能是由于编译器之间,而不是机器的位水平之间的差异。例如,一些FORTRAN 77编译器隐式地将save
应用于所有过程(子例程和函数)局部变量。这不是标准所要求的,不应该依赖这种行为。如果使用现代编译器编译传统程序,则需要使用save
时,如果局部变量应该跨过某个过程的调用保留其值,则这经常会导致问题。我不知道g77是否有这个“功能”。您可以使用编译器选项-fno-automatic
在gfortran中打开此行为。
编辑:考虑:
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
时也保存局部变量。至少在默认的优化级别。
编译与gfortran与选项fbackslash -ffixed-line-length-0 -std=legacy -g -O0 -fno-inline
输出是相同的。现在改为-O3
和输出是:
Call 1
Call 2
Call 3
Call 129
有时I
保留其值,有时没有。
改变一个程序的行:save FirstCall, I
和值始终保留:
Call 1
Call 2
Call 3
Call 4
尝试-fno-automatic
...
你在两台计算机上使用gfortran? –
不,在32位我使用g77 compilator。 – kozooh