1

実際のサブルーチンを型バインド プロシージャの背後に配置し、型定義を別のファイルに配置できるかどうか疑問に思っていました。例えば:

ファイル A:

Module TypeDef  
Type :: Test  
  Integer :: a,b,c  
contains  
  Procedure, Pass, Public :: add => SubAdd  
End Type  
Type(Test) :: Test  
  Interface  
   Subroutine SubAdd(this)  
      Import TypeDef  
      Class(TypeDef), Intent(InOut) :: this  
  End Subroutine  
  End Interface  
End Module  

ファイル B:

Module TypeRoutines  
   use TypeDef  
   Private :: SubAdd
contains  
   Subroutine SubAdd(this)  
      Class(TypeDef), Intent(InOut) :: this  
      this%c=this%a+this%b  
   End Subroutine  
End Module  

最初にファイル A をコンパイルしてからファイル B をコンパイルすると、次ifortのエラー メッセージが表示されるため、これは機能しません。

The name of the module procedure conflicts with a name in the encompassing scoping unit

これの主な理由は、型によっては、多くの型バインド プロシージャを作成する必要があり、一部のファイルは数百行にわたって展開され、作業が非常に面倒になるためです。最終的な目標は、すべてのサブルーチンを別のファイルに配置することです。

何か案は?

4

1 に答える 1

2

バインディングに渡された引数があると仮定します (そうでない場合は簡単です):

簡単!プロシージャーの本体を TypeDef モジュールのサブモジュールに配置し、プロシージャーのインターフェースをコピーして編集し、モジュール自体の仕様部分の別個のインターフェース本体にします。唯一の問題は、F2008 コンパイラ (サブモジュールをサポートするもの) が必要であり、現在の ifort がそれらの 1 つではないことです...

現実の世界では、次のオプションしかないと思います。

  • バインディングは、明示的なインターフェースを持つ外部プロシージャーにすることができます...そのため、特定のバインディングを実装する各プロシージャーを外部プロシージャー (試みたモジュール・プロシージャーではありません) にし、仕様部分の各外部プロシージャーのインターフェース本体を作成します。 module (行ったように) を作成し、各バインディングをそれぞれの外部プロシージャに関連付けます。外部プロシージャがアクセスする必要があるプライベート コンポーネントまたはバインディングが型に含まれている場合、このアプローチは失敗します。また、インターフェイス本体が外部プロシージャの実際のインターフェイスと一致するように注意する必要があります。

また

  • 各モジュール プロシージャを個別のファイルに配置し、モジュールの CONTAINS ステートメントの後にそれらの個別のファイルを INCLUDE します。

また

  • 大きなファイルと一緒に暮らす。
于 2013-10-09T05:01:41.377 に答える