1

我承认标题可能有点晦涩难懂,所以让我举个例子说明我想做什么和不做什么。我有一个主程序,它调用一个模块中的子程序:

Program Test_program

Use module_A
Implicit none
Integer :: i
i = 1
call subroutine_A(i)

End program Test_program

这个 subroutine_A 在模块 A 中,然后调用模块 B 中的函数 B:

module module_A

use module_B
implicit none
contains

subroutine subroutine_A(i)
implicit none
integer, intent(in) :: i
double precision :: j
j = function_B(i)
end subroutine subroutine_A

end module module_A

最后,module_B 看起来像这样:

module module_B
Implicit none
Contains

double precision function function_B(i)
implicit none
integer,intent(in) :: i
function_B = 5.d0*i
end function function_B

end module module_B

程序和模块在不同的文件中。不幸的是,这不会编译,因为我收到一条错误消息:

错误 Subroutine_A:对子程序 function_B 的引用不在 CALL 语句中。

程序似乎认为 function_B 是一个子程序,所以我不知道该怎么做。顺便说一句,我正在尝试按照我被告知的那样使用模块对我的子例程和函数进行适当的封装,但是如果这不是正确的方式,我愿意接受建议(我被告知不要使用接口,而是使用模块,因此这个测试)。

谢谢

4

1 回答 1

0

抱歉,我实际上“解开了”这个谜团:我没有使用名称 function_B,而是使用名称 Compute_Error。当我将该函数名称更改为其他名称时,上述方法有效。似乎我链接到某个地方的某个库有一个子程序 compute_error,尽管错误消息没有告诉我是哪一个,或者这是否是肯定的问题。无论如何,再次抱歉,但我想我可以发布该帖子,因为它有助于了解如何链接模块和过程(我在互联网上没有找到很多该特定示例的示例)。当然这种使用模块和程序的方式不是正确的方式,欢迎补充一些有用的知识。

于 2013-03-04T05:19:24.797 回答