我正在尝试编写一个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
%
答案 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