函数“f”作为参数传递给Fortran子例程时没有隐式类型
我在将函数作为参数正确传递给子例程时遇到了一个问题 我最初在一个.f90文件中编写了这个程序,但我不得不切换到代码块,因此需要将模块拆分为单独的文件。我遇到了一个我认为在拆分之前不存在的错误: 该程序使用名为“diff_eq.f90”的模块,该模块依次调用名为“find_root”的子例程。此子例程位于名为“roots.f90”的不同模块中 模块“diff_eq”通过以下方式调用“查找根”: 参数“f,df”是在另一个名为“wdstar.f90”的模块中定义的函数。例如,“f”的声明是 程序本身包含所有声明:函数“f”作为参数传递给Fortran子例程时没有隐式类型,fortran,Fortran,我在将函数作为参数正确传递给子例程时遇到了一个问题 我最初在一个.f90文件中编写了这个程序,但我不得不切换到代码块,因此需要将模块拆分为单独的文件。我遇到了一个我认为在拆分之前不存在的错误: 该程序使用名为“diff_eq.f90”的模块,该模块依次调用名为“find_root”的子例程。此子例程位于名为“roots.f90”的不同模块中 模块“diff_eq”通过以下方式调用“查找根”: 参数“f,df”是在另一个名为“wdstar.f90”的模块中定义的函数。例如,“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”的正确方法是什么
此时我得到一个错误:
符号“f”没有隐式类型
我在diff\u eq
中看不到任何f
的声明。(如果有,请出示。)
如果f
是外部的,则将其声明为外部的。或者使用f
所在的适当模块(如果位于模块中)
您可能只是缺少了
使用wdstar
,但您只显示了代码的一小部分,所以我不确定。为什么?如果这是显而易见的,你为什么在这里问?完整输出是什么?当错误发生时,编译器会报告代码行吗?@VladimirF我很抱歉用词不当。在问这个问题之前,我读了一些书,我理解需要显式地定义一个类型,否则有时会收到一些默认类型。所以我理解为什么应该有一些类型分配给函数,但我不理解它应该是什么。你是说错误的完整输出?编译器在“solve_star”函数中的“call find_root(f,df,[一堆参数])”行报告错误
use diff_eq
use roots
use wdstar
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