0

私は最近、Fortran 2008 の新機能、すなわちSUBMODULEs を発見しました。

質問の下で私の最小限の実例を見て​​ください。コンパイル後、ターミナルに以下を配置します。

 Accessed sub0
 Accessed sub1
 Accessed sub2

つまり、当然のことながら、 と のモジュール プロシージャはsub1相互に実行sub2でき、すべて問題ありません。CALL

コード アーキテクチャやメンテナンスなどの理由により、このアクセスを何らかの方法で制限する必要があります。つまり、モジュール プロシージャ (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
4

1 に答える 1

3

あまり。

sub1との両方sub2が によってアクセスされますsub0。つまり、次のいずれか (またはいくつかの組み合わせ):

  • sub例のsub2ように、モジュール/サブモジュール階層の同じレベルで認識されている必要がありますsub0sub1およびのサブプログラムはsub2、同じレベルsub0またはそれ以下である必要があります。この場合、ホストの関連付けにより、sub1またはsub2プロシージャの知識が他のプロシージャで利用できるようになります。

  • sub1sub2他の 2 つのモジュールのパブリック エンティティである必要があります。ただし、この場合、sub1orのサブプログラムはsub2常に、他方を定義するモジュールを直接参照できます。

  • sub1およびsub2外部プロシージャです。ここでも、sub1orのサブプログラムはsub2、他の外部プロシージャに直接アクセスできます。

ホスト エンティティの名前を隠す名前が子スコープにある場合 (または F2015 ドラフト標準の import ステートメントの拡張機能を使用することにより)、ホストのエンティティを子スコープから非表示にすることができます。特定のスコープから除外したいプロシージャーの名前と同じ名前の何かのダミー宣言を入れることもできますが、これはかなり人為的です。

于 2016-09-25T22:13:51.760 に答える