Fortran 77/90外部函数作参数报错:fun非函数的解决咨询
问题修复方案
核心错误原因
你在integrate子程序里把参数f声明成了double precision类型的变量,但实际上它应该是一个外部函数。编译器看到f是变量,自然会报错说fun不是函数(因为传递的fun被当成了变量而非函数)。
另外还有一个逻辑错误:你先调用了integrate,再去读入a,b,n,这会导致计算时用的是未初始化的垃圾值,结果肯定不对。
Fortran 77 修复版本
在Fortran77里,需要用external关键字声明子程序里的函数参数:
program integral implicit none external fun double precision a,b,results integer n ! 先读入参数,再调用积分子程序 read(5,*) a,b,n results = 0 call integrate(fun,a,b,n,results) write(6,*) results end program integral function fun(x) implicit none double precision fun double precision x fun = 4*x*x return end function fun subroutine integrate (f,a,b,n,results) implicit none ! 声明f是外部函数 external f integer i,n double precision a,b,h,results ! 移除原有的double precision f声明 results= 0 h = (b-a)/n do i=0,n-1 results = results + f(a+i*h) end do return end subroutine integrate
Fortran 90+ 修复版本
Fortran90支持用abstract interface来更安全地声明函数参数(类型匹配更严格),同时可以添加参数方向属性提升代码规范性:
program integral implicit none abstract interface function func_type(x) result(res) double precision, intent(in) :: x double precision :: res end function func_type end interface procedure(func_type) :: fun double precision :: a,b,results integer :: n read(*,*) a,b,n results = 0.0d0 call integrate(fun,a,b,n,results) write(*,*) results end program integral function fun(x) implicit none double precision, intent(in) :: x double precision :: fun fun = 4.0d0*x*x end function fun subroutine integrate(f,a,b,n,results) implicit none abstract interface function func_type(x) result(res) double precision, intent(in) :: x double precision :: res end function func_type end interface procedure(func_type) :: f integer, intent(in) :: n double precision, intent(in) :: a,b double precision, intent(out) :: results integer :: i double precision :: h results= 0.0d0 h = (b-a)/real(n,kind=kind(a)) do i=0,n-1 results = results + f(a + real(i,kind=kind(a))*h) end do end subroutine integrate
这个版本还通过real(n,kind=...)避免了整数除法的精度损失,代码鲁棒性更强。
内容的提问来源于stack exchange,提问作者Žarko Ivković
相关产品推荐
相关产品推荐

