函数没有 return 正确的值

Function doesn't return correct value

我正在尝试编写一个 Fortran 77 程序,其中一个子例程进行函数调用,该函数作为参数提供(给子例程)。

我面临的问题是函数 'bar' 没有 return 正确的结果。这是一个最小的(不是)工作示例:

% cat mwe.f
      real*8 function bar()
      print *,"bar:",bar
      bar = 101.0d00
      print *,"bar:",bar
      end

      subroutine foo(func)
      real*8 rv
      rv = func()
      print *,"rv:",rv
      end

      program tsig
      external bar
      call foo(bar)
      end
% gfortran mwe.f && ./a.out
 bar:   0.0000000000000000
 bar:   101.00000000000000
 rv:   0.0000000000000000
%

代码:simple.f

function bar()
  real*8 :: bar
  print *,"bar:",bar
  bar = 101.0d00
  print *,"bar:",bar
  return
end function bar

subroutine foo(func)
    interface
      function func()
        real*8 :: func
      end function func
    end interface
    real*8 rv
    rv = func()
    print *,"rv:",rv
end subroutine foo

program tsig
  external bar
  call foo(bar)
end

结果:

./a.out
 bar:   2.1219959811805460E-314
 bar:   101.00000000000000
 rv:   101.00000000000000

评论里说了,但也许应该说清楚,因为,你看起来还是很挣扎。保持(伪)Fortran 77 你必须做

  subroutine foo(func)
    real*8 rv
    real*8 func
    rv = func()
    print *,"rv:",rv
  end

原因是func的类型在foo中被假定为隐含的real。如果它 returns 其他类型,则必须明确声明它。

强烈建议将implicit none放在每个程序和子例程的开头。它不是 Fortran 77 标准的一部分,但 real*8 也不是。两者都只是常见的扩展。 implicit none 是 Fortran 90 的标准,real*8 根本不是标准的 Fortran。