Fortran子模块 - 无法打开模块文件»mod_globals.smod«

时间:2017-03-20 00:04:40

标签: fortran gfortran circular-dependency

我开始编写一个以模块组织的小Fortran程序。每个模块都包含一个initialize和finalize子程序,用于分配和解除分配。

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

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

我的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

1 个答案:

答案 0 :(得分:1)

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

如果您取出PRIVATE声明,您的代码会毫无障碍地编译。我无法跟踪标准,我对子模块的体验有限,所以我不确定这种行为是否正确。但是the gfortran documentation

  

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

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

public :: doAbort

还修复了编译。

我这里只安装了gfortran,因此无法与其他编译器一起测试。

我没有从你发布的内容中看到任何循环依赖的问题。