函数`f`在作为Fortran子例程的参数传递时没有隐式类型

时间:2017-05-06 18:33:03

标签: fortran

我在将函数作为参数正确传递给子例程时遇到问题。

我最初在单个.f90文件中编写程序,但我不得不切换到CodeBlocks,因此需要将模块拆分为单独的文件。我在分手前遇到了一个我认为不存在的错误:

该程序使用名为" diff_eq.f90"的模块,该模块又调用名为" find_root"的子程序。该子程序位于名为" roots .f90"。

的不同模块中

模块" diff_eq"电话" find_roots"通过:

module diff_eq
contains
  function solve_star([bunch of arguments]) result(r)
    use roots
    real(8) :: r,[bunch of arguments]
    call find_root(f,df,[bunch of arguments])
  end function solve_star
end module diff_eq

论证" f,df"是另一个名为" wdstar.f90"的模块中定义的函数。例如," f"的声明是

function f(r)
  real(8),intent(in) :: r(:)
  real(8) :: f(size(r))
  integer :: i,n
  real(8) :: dns(size(r)),prs(size(r))

  [bunch of calculations f(n) = ...]

end function f

并且程序本身包含所有声明:

use diff_eq
use roots
use wdstar

最后," find_root"通过以下方式声明这些功能:

subroutine find_root(f,df,r,[arguments])
    real(8),intent(in out) :: r(n)
    real(8) :: [more arguments]
    interface
       function f(r)
         real(8),intent(in) :: r(:)
         real(8) :: f(size(r))
       end function f
       function df(r)
         real(8),intent(in) :: r(:)
         real(8) :: df(size(r),size(r))
       end function df
    end interface

    [bunch o' calcs]

    end subroutine find_root

我的问题是:将这些功能传递给" find_root"是什么方法?

目前我收到错误:Symbol "f" has no IMPLICIT type

1 个答案:

答案 0 :(得分:1)

我无法在f中看到diff_eq的任何声明。 (如果有,请出示。)

如果f是外部的,请将其声明为此。或者使用f所在的适当模块(如果它在模块中)。

您可能只是缺少use wdstar,但是只显示代码的一小部分,所以我不确定。