Fortran:包含在一个模块中的过程可以调用包含在同一模块中的另一个过程吗?

计算科学 正则
2021-12-24 14:03:47

例如,考虑一个具有以下一般结构的模块:

module test
    implicit none

    contains 

    function f(x)
    ...
    end function f


    subroutine sub()
    ...
        y = f(x)
    ...   
    end subroutine


end module test

因此这是不正确的,就像在 a 内部做类似的事情一样program(内部程序不能相互引用)。当我在一个模块中测试它时,我仍然得到同样的错误。目前我把f模块放在外面,它可以工作。我对此不满意的原因是我希望f对使用测试的程序可用;现在它仅可用于在此模块文件中定义的过程。

2个回答

在该代码中放入两个print, *s 并自行测试。这是一个非常简单的测试问题。

你的模块没有问题。是的,您当然可以从另一个模块过程中调用一个模块过程。这是自 1980 年代以来 Fortran 中存在模块的主要原因之一:将所有相关过程封装在一个编程单元中。但请记住,您不需要use一个模块过程来在另一个模块过程中调用它。所有模块过程的接口都是相互公开的。所以这是错误的:

module test

    implicit none

contains 

    function f(x)
    end function f

    subroutine sub()
        use test, only: f ! This is wrong and there is no need for it
        y = f(x)
    end subroutine

end module test

如果您有一个问题的最小工作示例,这可能有助于更好地确定错误原因。我怀疑这个错误与您的想法无关,因为在 Fortran 中完全有可能。