【问题标题】:Fortran Submodules - Can't open module file »mod_globals.smod«Fortran 子模块 - 无法打开模块文件 »mod_globals.smod«
【发布时间】:2017-03-20 00:04:39
【问题描述】:

我开始编写一个按模块组织的小 Fortran 程序。每个模块都包含一个用于分配和解除分配的初始化和完成子例程。

现在我在模块globals 中使用一个名为“Abort”的子例程获得循环依赖。如果发生错误,此子例程应调用每个模块的 finalize 子例程。对“Abort”子程序的调用是经过一些计算后放在所有模块中的。

我的计划是使用 Fortran 2008(2003) 引入的子模块。但这并没有解决问题。我是否理解错误的子模块功能?

我的 Fortran 编译器告诉我:

无法打开模块文件 »mod_globals.smod« 在 (1) 处读取:没有 文件或目录

这里是模块全局变量的一部分:

! Module Globals
MODULE MOD_GLOBALS
    IMPLICIT NONE
    PRIVATE

    INTERFACE
        MODULE SUBROUTINE doAbort()
        END SUBROUTINE doAbort
    END INTERFACE

CONTAINS

    SUBROUTINE setAbortFlag(fileString,errorLine)
        ... fill variables with the fileString and errorLine
        CALL doAbort()
    END SUBROUTINE setAbortFlag

END MODULE MOD_GLOBALS

! Submodule 
SUBMODULE (MOD_GLOBALS) S_MOD_GLOBALS
    IMPLICIT NONE

CONTAINS

    MODULE PROCEDURE doAbort
        USE MOD_TEST, ONLY: finalizeTEST

        CALL finalizeTEST()

        EXIT(-1)
    END PROCEDURE doAbort

END SUBMODULE S_MOD_GLOBALS

这里是测试模块的相应代码部分:

! Module Test
MODULE MOD_TEST
    IMPLICIT NONE
    PRIVATE
    PUBLIC finalizeTEST, doSomeStuff

CONTAINS

    SUBROUTINE finalizeTEST()
        ... do some deallocations
    END SUBROUTINE finalizeTEST

    SUBROUTINE doSomeStuff()
        USE MOD_GLOBALS, ONLY: setAbortFlag

        ... maybe error in some calculations
        CALL setAbortFlag(__FILE__,__LINE__)
    END SUBROUTINE doSomeStuff

END MODULE MOD_TEST

【问题讨论】:

  • 为什么你认为你有任何循环依赖?我没有看到。也许您需要向我们展示真实的代码。
  • 我已经用我的代码的更高级示例更新了我的初始帖子。现在循环依赖应该是可见的。子模块现在可以工作了,但没有解决循环依赖的问题。
  • SUBEOUTINE setAbortFlag(fileString,errorLine) SUBEOUTINE finalizeTEST()
  • 这里没有错字问题。编辑器写错了,抱歉。

标签: fortran gfortran circular-dependency


【解决方案1】:

更多的是评论而不是答案,但评论框提供的格式化方式非常少......

如果您取出PRIVATE 语句,您的代码将顺利编译。我无法将其跟踪到标准,并且我对子模块的经验有限,所以我不确定这种行为是否正确。但是the gfortran documentation 状态

支持子模块。需要注意的是 MODULE 不会生成后代 SUBMODULE 所需的 smod 文件,除非它们包含至少一个 MODULE PROCEDURE 接口。原因是没有 MODULE PROCEDURE 的 SUBMODULE 是无用的。有关讨论和解释草案,请参阅 http://j3-fortran.org/doc/meeting/207/15-209.txt。采用这种解释的好处是不使用子模块的代码不会生成smod文件。

我怀疑PRIVATE 导致接口没有从模块中“导出”,因此它不包含任何内容(有用)并且被前一段中解释的陷阱捕获。添加行

public :: doAbort

还修复了编译。

我这里只安装了gfortran,所以不能用其他编译器测试。

从您发布的内容来看,我没有看到任何与循环依赖相关的问题。

【讨论】:

  • 啊,我明白了 - 感谢您的帮助。我已经阅读了您发布的文章,但从未考虑过私人声明。它也用 gFortran 为我编译。但是循环依赖的问题似乎没有得到解决(我还在一个子模块中移动了相应的子程序,由 doAbort 调用)。我应该用更多文件开始一个新问题吗?
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 2022-01-26
  • 2016-12-05
  • 2021-05-05
  • 1970-01-01
  • 2015-06-09
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多