FORTRAN 90多个调用语句

时间:2013-09-06 21:47:08

标签: fortran fortran90 fortran77

正在处理一些遗留的FORTRAN代码。作者定义了一个名为REDUCE_VEC()的函数(不是子程序,而是一个重要的函数)。它接受一维数组并返回一个标量实数* 8。因此,如果你想“减少”你的向量,你可以调用函数

RV = REDUCE_VEC(V1)

一切都很好。但偶尔,他的线条看起来像

CALL REDUCE_VEC(V2)

所以,有两个问题:1)第二种形式的呼叫到底有什么作用? (注意,没有办法返回数据。)2)这甚至不会在gfortran下编译,即使它与PGI一起编译,所以这甚至是合法的FORTRAN吗?

感谢。

2 个答案:

答案 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进行编译甚至不会立即崩溃,而sunf90gfortran只有在单独的源文件中才能编译,然后结果也不会崩溃机。如果将返回值放在寄存器中,则可能不会对程序的其余部分造成损害,但是否则很可能会发生堆栈损坏。

答案 1 :(得分:4)

这不是合法的Fortran。如上所述,它很可能是一个编程错误(不同范围内的同名可能引用不同的东西,但这不是问题隐含的内容)。如果Fortran处理器碰巧支持对允许这种情况的语言的扩展,那么会发生什么取决于Fortran处理器。否则,“任何事情”都可能发生,“任何事情”可能包括(但不限于)“没有”,或“非常非常糟糕的事情”。