我在将函数作为参数正确传递给子例程时遇到问题。
我最初在单个.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
答案 0 :(得分:1)
我无法在f
中看到diff_eq
的任何声明。 (如果有,请出示。)
如果f
是外部的,请将其声明为此。或者使用f
所在的适当模块(如果它在模块中)。
您可能只是缺少use wdstar
,但是只显示代码的一小部分,所以我不确定。