1

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

RV = REDUCE_VEC(V1)

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

CALL REDUCE_VEC(V2)

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

谢谢。

4

2 回答 2

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

于 2013-09-08T10:43:59.220 回答
4

它不是合法的 Fortran。如前所述,它很可能是编程错误(不同范围内的相同名称可能指代不同的事物,但这不是问题所暗示的)。如果 Fortran 处理器碰巧支持允许这样做的语言扩展,那么会发生什么取决于 Fortran 处理器。否则,可能会发生“任何事情”,其中“任何事情”可能包括(但不限于)“没有”或“非常非常糟糕的事情”。

于 2013-09-06T23:57:52.807 回答