Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran子模块-Can';t打开模块文件»;mod_globals.smod和#xAB;_Fortran_Gfortran_Circular Dependency - Fatal编程技术网

Fortran子模块-Can';t打开模块文件»;mod_globals.smod和#xAB;

Fortran子模块-Can';t打开模块文件»;mod_globals.smod和#xAB;,fortran,gfortran,circular-dependency,Fortran,Gfortran,Circular Dependency,我开始编写一个用模块组织的Fortran小程序。每个模块都包含一个用于分配和释放的初始化和最终确定子例程 现在,我在模块globals中使用名为“Abort”的子例程获得循环依赖项。如果发生错误,此子例程应调用每个模块最终确定子例程。经过一些计算后,“中止”子例程的调用被放置在所有模块中 我的计划是使用Fortran 2008(2003)引入的子模块。但这并不能解决问题。我是否错误地理解了子模块的功能 我的Fortran编译器告诉我: 无法在(1)处打开模块文件»mod_globals.smod

我开始编写一个用模块组织的Fortran小程序。每个模块都包含一个用于分配和释放的初始化和最终确定子例程

现在,我在模块
globals
中使用名为“Abort”的子例程获得循环依赖项。如果发生错误,此子例程应调用每个模块最终确定子例程。经过一些计算后,“中止”子例程的调用被放置在所有模块中

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

我的Fortran编译器告诉我:

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

这是模块globals的一部分:

! 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

与其说是答案,不如说是评论,但评论框在格式方面提供的内容太少了

如果取出
PRIVATE
语句,代码编译就不会有任何问题。我无法将其跟踪到标准,并且我对子模块的经验有限,因此我不确定这种行为是否正确。然而国家

支持子模块。应该注意的是,模块不会生成子模块所需的smod文件,除非它们至少包含一个模块过程接口。这是因为没有模块过程,子模块是无用的。有关讨论和解释草案,请参阅。采用这种解释的优点是,不使用子模块的代码不会生成smod文件

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

public :: doAbort
还修复了编译

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


从您发布的内容来看,我看不出循环依赖有任何问题。

为什么您认为自己有任何循环依赖?我没有看到。也许你需要向我们展示真正的代码。我已经用一个更高级的代码示例更新了我的初始帖子。现在循环依赖项应该是可见的。子模块现在可以工作,但没有解决循环依赖关系的问题。
SUBEOUTINE setAbortFlag(fileString,errorLine)
SUBEOUTINE finalizeTEST()
这里没有输入错误问题。编辑写错了,对不起。啊,我看到了-谢谢你的帮助。我已经读了你的文章,但从来没有想过你的私人声明。它也为我编译了gFortran。但循环依赖性的问题似乎并没有得到解决(我也在子模块中移动了相应的子例程,由doAbort调用)。我应该用更多的文件开始一个新问题吗?