正在处理一些遗留的FORTRAN代码。作者定义了一个名为REDUCE_VEC()的函数(不是子程序,而是一个重要的函数)。它接受一维数组并返回一个标量实数* 8。因此,如果你想“减少”你的向量,你可以调用函数
RV = REDUCE_VEC(V1)
一切都很好。但偶尔,他的线条看起来像
CALL REDUCE_VEC(V2)
所以,有两个问题:1)第二种形式的呼叫到底有什么作用? (注意,没有办法返回数据。)2)这甚至不会在gfortran下编译,即使它与PGI一起编译,所以这甚至是合法的FORTRAN吗?
感谢。
答案 0 :(得分:5)
如果接口是隐式的,这将使用许多处理器编译,因为编译器无法检查它,它只是调用一些符号。请考虑以下事项:
function f(a)
dimension a(*)
f = 0
do i=1,10
f = f + a(i)
end do
end function
program p
call f([1.,2.,3.,4.,5.,6.,7.,8.,9.,10.])
end program
使用ifort
进行编译甚至不会立即崩溃,而sunf90
和gfortran
只有在单独的源文件中才能编译,然后结果也不会崩溃机。如果将返回值放在寄存器中,则可能不会对程序的其余部分造成损害,但是否则很可能会发生堆栈损坏。
答案 1 :(得分:4)
这不是合法的Fortran。如上所述,它很可能是一个编程错误(不同范围内的同名可能引用不同的东西,但这不是问题隐含的内容)。如果Fortran处理器碰巧支持对允许这种情况的语言的扩展,那么会发生什么取决于Fortran处理器。否则,“任何事情”都可能发生,“任何事情”可能包括(但不限于)“没有”,或“非常非常糟糕的事情”。