我有一个模块,我编写了一堆经常使用的子程序。但是,并非每次我都需要它们。是否可以从该模块加载一个(或两个......)子程序?
我这样做的兴趣是有一个特殊的子程序需要另一个模块才能工作,所以如果我不打算使用那个子程序,我宁愿避免加载那个额外的模块。
以下是我所拥有的一个例子
MODULE MYLIBRARY
IMPLICIT NONE
CONTAINS
SUBROUTINE PROC1
PRINT *, 'This is PROC1'
END SUBROUTINE PROC1
SUBROUTINE PROC2
USE EXTRAMOD
PRINT *, 'This is PROC2'
END SUBROUTINE PROC2
END MODULE MYLIBRARY
我希望能够只加载我的主程序PROC1,所以我不必加载模块EXTRAMOD(实际上我甚至不想要那个文件)。在我的主程序中,我尝试了仅选项,但这似乎只适用于变量而不是子程序。以下是主文件
的示例PROGRAM MAIN
USE MYLIBRARY, ONLY : PROC1
IMPLICIT NONE
CALL PROC1
END PROGRAM Main
当我编译它时,我收到错误“打开已编译模块文件时出错。检查INCLUDE路径。[EXTRAMOD]”。
有什么想法吗?
答案 0 :(得分:3)
除非您更改MYLIBRARY
模块的来源,使其不再引用EXTRAMOD
,否则您无法使用该编译器执行此操作。
(ONLY说明符确实可以限制在给定范围内可访问的模块的标识符,包括过程的标识符,但这与您的基础问题无关。)
请注意,对于给定的源,您看到的行为是特定于编译器的。
使用该编译器,存储在mod
文件(用于将信息从模块传送到使用模块的位置的编译器特定文件)中的信息通常限于在该模块中立即声明的内容。这意味着在模块引用另一个模块的情况下,编译器通常需要在使用原始模块时找到该另一个模块的mod
文件。
其他编译器可能会使每个mod文件完整 - 存储模块中立即声明的内容和其他模块引用的内容。这减少了需要分发的文件数量,但会产生更大的mod文件。
如果两个子例程完全相互独立,那么您可以将MYLIBRARY
模块的源分成两部分,并且只使用包含所需模块的分割部分。
如果EXTRAMOD
中的实体不属于PROC2
的特征(例如,如果您使用EXTRAMOD
中定义的类型作为PROC2
的参数类型,然后EXTRAMOD
中的实体被用作特征的一部分),然后您可以将PROC2
的定义移动到子模块中。这也会打破MYLIBRARY
的mod文件对EXTRAMOD
的mod文件的依赖。