You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:10:35