函数没有 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。
我正在尝试编写一个 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。