0

グーグルで何も見つからなかったので...

私はFortran90のすべてのオブジェクト指向機能を使用して、特定の作業(C ++のクラスなど)用のモジュールを作成しようとしています。私はこのようなものを書きました:

module test

integer, PRIVATE :: dummy
PUBLIC :: sub

contains 

subroutine sub()
dummy = 1
end subroutine sub

end module test

しかし、私にはそのようなサブルーチンが約10個あり、それらすべてを1つのファイルに配置することは非常に悪い考えです。コンパイラー、つまりsubモジュールサブルーチンに伝えることはできますが、別のファイルに配置することはできますか?なぜなら、このコードは、その本体を定義した場合にのみコンパイルされるように見えるからsubです。

4

2 に答える 2

1

可能です。良いかどうかはわかりませんが、可能です。include "filename"使用することも、先行するものを使用する場合も使用できます#include "filename"

includeこのようにして、ステートメントの代わりに他のファイルのテキストを含めます。しかし、それが前向きなことであるかどうかは議論の余地があります。1つのファイル内の10のプロシージャは、極端に長くない場合、通常はそれほど多くないためです(おそらく、変更する必要があります)。

(私は注意しなければなりません、私が最後にインクルードについて言及したとき、私はそれを好まない人々によって強く反対された可能性があります。)

また、Fortran 2003は、型にバインドされたプロシージャを含む、はるかに多くのオブジェクト指向をもたらすことに注意してください。オブジェクトのインスタンスがさらに必要な場合は、tahtを検討する価値があります。

于 2012-09-14T11:41:48.333 に答える
1

あなたの質問への直接の答えとして-はい-あなたはモジュールの残りの定義を含むファイル内からINCLUDEの定義を含むファイルを参照するために行を使用することができます(サブルーチンコードを持つファイルのインクルード行はモジュール内のステートメントのsub後に来る。CONTAINS

MODULE test
  INTEGER, PRIVATE :: dummy
  PUBLIC :: sub
CONTAINS
  INCLUDE 'sub.f90'
END MODULE test

! sub.f90
SUBROUTINE sub
  dummy = 1
END SUBROUTINE sub

ただし、これは非定型の配置です。さらに、「それらすべてを1つのファイルに配置することは非常に悪い考え」である場合、おそらく異なるサブルーチンを1つのモジュールから使用できるようにすることは良い考え(または必要)ですか?

より一般的なF90ソリューションは、共有データ(ダミー)をパブリックエンティティとして1つの「低レベル」モジュールに配置し、必要に応じて低レベルモジュールを使用する一連の「中レベル」モジュールにサブルーチン定義を配置することです。次に、中間モジュールを使用し、クライアントコードへの集合的なエクスポートを提供する最終的な「高レベル」モジュールの場合。次に、言語規則ではなくソースコード規則を使用して、クライアントコードが中間および低レベルモジュールを直接使用しないようにします。

MODULE low_level_shared
  IMPLICIT NONE
  INTEGER, PUBLIC :: dummy
END MODULE low_level_shared

MODULE intermediate_sub1
  IMPLICIT NONE
CONTAINS
   SUBROUTINE sub1
     USE low_level_shared
     dummy = 1
   END SUBROUTINE sub1
END MODULE intermediate_sub1

MODULE intermediate_sub2
  IMPLICIT NONE
CONTAINS
   SUBROUTINE sub2
     USE low_level_shared
     ...
   END SUBROUTINE sub2
END MODULE intermediate_sub2

MODULE high_level
  USE intermediate_sub1
  USE intermediate_sub2
  PRIVATE
  PUBLIC :: sub1, sub2
END MODULE high_level

PROGRAM client_code
  USE high_level
  ...
  CALL sub1
END PROGRAM client_code

Fortran 2008では、サブモジュール機能を介して追加の構造と制御が可能です。この機能では、モジュールプロシージャのインターフェイスを、モジュールプロシージャの実装とは別のプログラムユニットで定義できます。

于 2012-09-14T11:53:35.463 に答える