2016-09-25 6 views
0

私は最近、Fortran 2008の新機能、すなわちSUBMODULEを発見しました。他のモジュール手続きからのモジュール手続きへのアクセスの制限

私の最小作業例を質問してください。コンパイル後は、ターミナルで次のように置く:すべてがOKであることは、すべきsub1のモジュール手続きとsub2できCALL互いにように、ある

Accessed sub0 
Accessed sub1 
Accessed sub2 

コードアーキテクチャーやメンテナンスなどの理由から、このアクセスを何とか制限する必要があります。つまり、モジュール手順(sub1sub2)はお互いに見えないようにしてください。 できますか?

MODULE parent 
    PRIVATE 
    PUBLIC :: sub0 
    INTERFACE 
     MODULE SUBROUTINE sub1() 
     END SUBROUTINE 
     MODULE SUBROUTINE sub2() 
     END SUBROUTINE 
    END INTERFACE 
    CONTAINS 
    SUBROUTINE sub0() 
     PRINT *, 'Accessed sub0' 
     CALL sub1() 
    END SUBROUTINE 
END MODULE 

SUBMODULE (parent) submod1 
    CONTAINS 
    MODULE PROCEDURE sub1 
     PRINT *, 'Accessed sub1' 
     CALL sub2() 
    END SUBROUTINE 
END SUBMODULE 

SUBMODULE (parent) submod2 
    CONTAINS 
    MODULE PROCEDURE sub2 
     PRINT *, 'Accessed sub2' 
    END PROCEDURE 
END SUBMODULE 

PROGRAM driver 
    USE parent 
    CALL sub0() 
END PROGRAM 
+0

なぜ2つの手順で2つのモジュールを分離するだけではないのですか? –

+0

@VladimirFはい、もちろんです。これはまさに私が今やっていることです。しかし、私は 'SUBMODULE'のようなFortranの新しいモダンな機能を維持しようとしています。私の知る限りでは、C#のコードマップのようなものはFortranでは利用できないので、膨大なソースコード(デバッグ、メンテナンス、開発)を扱うことを恐れています。プロシージャ間の 'CALL 'の制御を単純化するために上記のスキームを試しましたが、それは間違っているようです。 – Shaqpad

答えて

3

実際にはありません。

  • subsub2は、sub0としてモジュール/サブモジュールの階層の同じレベルに知らなければならない。

    sub1sub2両方はいずれかの(またはいくつかの組み合わせ)ことを意味し、sub0によってアクセスされます例のように。 sub1sub2のサブプログラムは、sub0以下と同じレベルでなければなりません。この場合、ホストアソシエートは、sub1またはsub2プロシージャの知識を他の手順で利用できるようにします。

  • sub1およびsub2は、他のいくつかのモジュールの公開エンティティである必要があります。しかしこの場合、sub1またはsub2というサブプログラムは、常に他のモジュールを定義するモジュールを直接参照するだけです。

  • sub1およびsub2は外部手順である。ここでも、サブプログラムsub1またはsub2は、他の外部プロシージャに直接アクセスできます。 F2015のドラフトでimport文の拡張機能を使用することによって(またはホストエンティティに名前をシャドウ子スコープ内の名前がある場合は、ホストで

エンティティは、子スコープから非表示にすることができます標準)。特定のスコープからブロックするプロシージャーの名前と同じ名前のダミー宣言を置くことができますが、これはむしろ人工的です。

+0

* "sub1とsub2は他の2つのモジュールの公開エンティティである必要がありますが、この場合、sub1またはsub2のサブプログラムは、常に他のモジュールを直接参照することができます。 –