【发布时间】: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