指定子程序接口的模块
Module specifying subroutine interfaces
我的库有为某些子程序指定抽象接口的模块,像这样:
module abstract_module
implicit none
! interface of subroutines
abstract interface
subroutine sub_interface(...)
...
end subroutine
end interface
end module
现在在我的程序中我写了一个子程序,为了正确使用它,我必须声明它并且它工作得很好:
program testsub
use abstract_module
...
implicit none
! custom interface
procedure(sub_interface) :: custom
! call the subroutine via another one
call test_call(custom)
end program
现在我想将所有自定义子例程收集到一个模块中,但我不知道如何指定一个子例程实际上是依附于一个接口:
module custom_subs
use abstract_module
implicit none
! this does not compile, obviously
abstract interface
procedure(sub_interface) :: custom
end interface
contains
subroutine custom(...)
...
end subroutine
end module
有没有办法像我在程序中所做的那样在模块中指定子例程,还是必须将它们留在程序本身中?
您有一堆外部过程,您希望在使用它们时为它们提供显式接口。您正在考虑两种方法:
- 使用界面块
- 制作程序本身模块程序
这是两种不同的且不兼容的方法。您必须选择其中之一;您不能将它们混合用于同一程序。
将外部过程转换为模块过程是一个值得称赞的目标。考虑模块
module custom_subs
implicit none
contains
subroutine custom(...)
...
end subroutine
end module
也就是说,只需将程序放入模块中:不用担心使用其他 abstract_module
模块或添加接口块。实际上,销毁 abstract_module
- 您不再将 custom
作为外部过程,因此它的接口将无法解析。
这个答案只是为了解决关于这些方法是否互补的困惑。可以在其他问题中找到有关每种方法的更多详细信息,例如 this one and this one.
我的库有为某些子程序指定抽象接口的模块,像这样:
module abstract_module
implicit none
! interface of subroutines
abstract interface
subroutine sub_interface(...)
...
end subroutine
end interface
end module
现在在我的程序中我写了一个子程序,为了正确使用它,我必须声明它并且它工作得很好:
program testsub
use abstract_module
...
implicit none
! custom interface
procedure(sub_interface) :: custom
! call the subroutine via another one
call test_call(custom)
end program
现在我想将所有自定义子例程收集到一个模块中,但我不知道如何指定一个子例程实际上是依附于一个接口:
module custom_subs
use abstract_module
implicit none
! this does not compile, obviously
abstract interface
procedure(sub_interface) :: custom
end interface
contains
subroutine custom(...)
...
end subroutine
end module
有没有办法像我在程序中所做的那样在模块中指定子例程,还是必须将它们留在程序本身中?
您有一堆外部过程,您希望在使用它们时为它们提供显式接口。您正在考虑两种方法:
- 使用界面块
- 制作程序本身模块程序
这是两种不同的且不兼容的方法。您必须选择其中之一;您不能将它们混合用于同一程序。
将外部过程转换为模块过程是一个值得称赞的目标。考虑模块
module custom_subs
implicit none
contains
subroutine custom(...)
...
end subroutine
end module
也就是说,只需将程序放入模块中:不用担心使用其他 abstract_module
模块或添加接口块。实际上,销毁 abstract_module
- 您不再将 custom
作为外部过程,因此它的接口将无法解析。
这个答案只是为了解决关于这些方法是否互补的困惑。可以在其他问题中找到有关每种方法的更多详细信息,例如 this one and this one.