函数未返回正确的值

时间:2016-01-19 11:20:39

标签: fortran fortran77

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

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

% 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
%

2 个答案:

答案 0 :(得分:3)

评论中有人说过,但也许应该明确说明,因为你似乎仍然很挣扎。保持(伪)Fortran 77你必须做

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

原因是假设func的类型在real内隐含foo。如果返回其他类型,则必须明确声明它。

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

答案 1 :(得分:0)

代码: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