2017-03-20 38 views
1

我開始編寫一個模塊化的小型Fortran程序。每個模塊由用於分配和釋放的初始化和完成子例程組成。Fortran子模塊 - 無法打開模塊文件»mod_globals.smod«

現在我在模塊globals中獲得一個名爲「Abort」的子例程的循環依賴關係。如果發生錯誤,該子程序應該調用每個模塊的最終子程序。經過一些計算後,「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

爲什麼你認爲你有任何循環依賴?我沒有看到任何。也許你需要向我們展示真實的代碼。 –

+0

我已經用我的代碼更高級的示例更新了我的初始帖子。現在循環依賴應該是可見的。子模塊現在可以工作,但並未解決循環依賴問題。 – Florian

+0

'SUBEOUTINE setAbortFlag(fileString,errorLine)''SUBEOUTINE finalizeTEST()'< - 這是從代碼複製?如果是的話,你在那裏得到一個錯字。 –

回答

1

超過一個答案評論,但評論框在格式化的方式提供了這麼一點......如果你拿出PRIVATE聲明

你的代碼編譯順利。我無法跟蹤這個標準,並且我對子模塊的使用經驗有限,所以我不確定這種行爲是否正確。然而the gfortran documentation狀態

支持子模塊。應該注意的是MODULEs不會產生後代SUBMODULE所需的smod文件,除非它們至少包含一個MODULE PROCEDURE接口。原因是SUBMODULE在沒有MODULE PROCEDURE的情況下是無用的。參見http://j3-fortran.org/doc/meeting/207/15-209.txt討論和解釋草案。採用這種解釋有一個優點,即不使用子模塊的代碼不會生成smod文件。

我懷疑PRIVATE使接口從所述模塊,其因此包含任何(有用)和落入由疑難雜症在前面的段落解釋爲不「出口」。添加行

public :: doAbort 

也修復了編譯。

我只在這裏安裝gfortran,所以不能用其他編譯器測試。

我從您發佈的內容中看不到任何循環依賴問題。

+0

啊,我看到了 - 感謝您的幫助。我已經閱讀了您發佈的文章,但從未想過私人陳述。它也用gFortran爲我編譯。但是循環依賴的問題似乎沒有解決(我也在子模塊中移動了由doAbort調用的相應子例程)。我應該用更多的文件開始一個新的問題嗎? – Florian