我开始编写一个以模块组织的小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
答案 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,因此无法与其他编译器一起测试。
我没有从你发布的内容中看到任何循环依赖的问题。