【问题标题】:Loading only one subroutine from module从模块中只加载一个子程序
【发布时间】:2016-04-21 16:42:04
【问题描述】:

我有一个模块,我在其中编写了一堆我经常使用的子例程。但是,并非每次我都需要它们。是否可以从该模块仅加载一个(或两个...)子例程?

我这样做的兴趣在于,有一个特定的子例程需要另一个模块才能工作,所以如果我不打算使用那个子例程,我宁愿避免加载那个额外的模块。

这是我所拥有的示例

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(实际上我什至不需要该文件)。在我的主程序中,我尝试使用 ONLY 选项,但这似乎只适用于变量而不是子例程。这是主文件的示例

PROGRAM MAIN    
  USE MYLIBRARY, ONLY : PROC1
  IMPLICIT NONE
  CALL PROC1  
END PROGRAM Main

当我编译它时,我收到错误“打开编译的模块文件时出错。检查包含路径。[EXTRAMOD]”。

有什么想法吗?

【问题讨论】:

  • only 子句也必须与子程序一起使用!显示一个最小且可验证的示例,它会给您带来麻烦stackoverflow.com/help/mcve。究竟是什么意思“这似乎只适用于变量而不是子程序”?你有什么证据?

标签: module fortran intel-fortran


【解决方案1】:

使用该编译器无法实现您想要做的事情,除非您更改 MYLIBRARY 模块的源代码,使其不再引用 EXTRAMOD

(ONLY 说明符确实可以限制在给定范围内可访问的模块中的标识符,包括过程的标识符,但这与您的潜在问题无关。)

请注意,对于给定源,您看到的行为是特定于编译器的。

使用该编译器,存储在 mod 文件(这是一个编译器特定文件,用于将信息从模块传递到使用模块的地方)中的信息通常仅限于编译模块的内容立即在该模块中声明。这意味着在一个模块引用另一个模块的情况下,编译器通常需要在使用原始模块时为另一个模块找到mod文件。

其他编译器可能使每个 mod 文件完整 - 存储模块中立即声明的内容以及从其他模块引用的任何内容。这会减少需要分发的文件数量,但会导致 mod 文件更大。

如果两个子程序是完全独立的,那么你可以将MYLIBRARY模块的源码拆分成两个,只使用拆分中包含你需要的模块的部分。

如果EXTRAMOD 中的实体不是PROC2 特征的一部分(例如,如果您使用EXTRAMOD 中定义的类型作为PROC2 的参数类型,那么EXTRAMOD 中的实体是被用作特征的一部分),那么您可以将PROC2 的定义移动到子模块中。这也将打破 MYLIBRARY 的 mod 文件对 EXTRAMOD 的 mod 文件的依赖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多