2017-03-20 9 views
1

モジュールで編成された少しのFortranプログラムをプログラムし始めました。各モジュールは、割り振りと割り振り解除のためのサブルーチンの初期化とファイナライズで構成されています。Fortranサブモジュール - モジュールファイルを開くことができません»mod_globals.smod«

ここでは、モジュール「globals」の中に「Abort」と呼ばれるサブルーチンを持つ循環依存関係があります。このサブルーチンは、エラーが発生した場合に各モジュールがサブルーチンを終了するよう呼び出す必要があります。 "Abort"サブルーチンの呼び出しは、いくつかの計算の後、すべてのモジュールに置かれます。

私の計画は、Fortran 2008(2003)で導入されたサブモジュールを使用することでした。しかし、それは問題を解決することはありません。 Submodules機能が間違っていると理解していますか?

私のFortranコンパイラは私に語った:ここではそのような ファイルまたはディレクトリ

とはありません:

は、(1)で読み込むためのオープンモジュールファイル»mod_globals.smod«することはできませんモジュールのグローバルの部分:ここで

! 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 

とテストモジュールのそれぞれのコード部分:

あなたが PRIVATE声明を取る場合

あなたのコードが滞りなくコンパイル...

! 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

'' '' setAbortFlag(fileString、errorLine) '' SUBEOUTINE finalizeTEST() '' - これはコードからコピーされたものですか?はいの場合は、そこにタイプミスがあります。 –

答えて

1

答えよりも、コメントの詳細が、コメントボックスは、フォーマットの方法で、これほど少ないのを提供しています。私は標準にこれを追跡することはできませんし、サブモジュールの経験が限られているので、この動作が正しいかどうかわかりません。しかし、the gfortran documentation

サブモジュールがサポートされています。少なくともMODULE PROCEDUREインターフェースを含んでいない限り、MODULEは子孫のSUBMODULEに必要なsmodファイルを生成しないことに注意してください。これは、SUBMODULEはMODULE PROCEDUREなしでは役に立たないからです。説明と解説草案については、http://j3-fortran.org/doc/meeting/207/15-209.txtを参照してください。この解釈を採用すると、サブモジュールを使用しないコードがsmodファイルを生成しないという利点があります。

私はPRIVATEインターフェイスは、したがって(有用な)何も含まず、前項で説明した落とし穴によって捕捉されたモジュールから「エクスポート」ではないさせると思われます。行を追加する

public :: doAbort 

もコンパイルを修正します。

ここにはgfortranしかインストールされていないので、他のコンパイラでテストすることはできません。

あなたが投稿したものから、循環依存関係の問題はありません。

+0

ああ、私はそれを参照してください - あなたの助けをありがとう。私は既にあなたが投稿した記事を読んだが、プライベートステートメントについては考えなかった。それはgFortranでも私のためにコンパイルされます。しかし、循環依存の問題は解決されていないようです(サブモジュールでdoAbortによって呼び出されるそれぞれのサブルーチンも移動しました)。より多くのファイルで新しい質問を開始する必要がありますか? – Florian

関連する問題