FORTRAN 90多个调用语句

bob*_*nto 1 fortran fortran77 fortran90

我正在使用一些遗留的FORTRAN代码.作者定义了一个名为REDUCE_VEC()的函数(不是子程序,而是一个重要的函数).它接受一维数组并返回一个标量实数*8.因此,如果您想"减少"矢量,则可以调用该函数

RV = REDUCE_VEC(V1)
Run Code Online (Sandbox Code Playgroud)

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

CALL REDUCE_VEC(V2)
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Vla*_*r F 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
Run Code Online (Sandbox Code Playgroud)

编译,甚至不会立即崩溃ifort,sunf90而且gfortran只有当它在单独的源文件中时才编译,然后结果也不会在我的机器上崩溃.如果将返回值置于寄存器中,则可能不会对程序的其余部分造成损害,但是否则很可能会发生堆栈损坏.

  • 如果在ifort命令行中添加"-warn参数",则会得到:t.f90(10):错误#6552:CALL语句正在调用函数子程序作为子例程.[F]调用f([1.,2.,3.,4.,5.,6.,7.,8.,9.,10.])------- ^ (2认同)