1

次のエラー メッセージが表示されます。

The name of the module procedure conflicts with a name
in the encompassing scoping unit.   [ADD_SUB]

ifort 12.0.3以下のソース コードをubuntu 12.0464 ビット プラットフォームでコンパイルする場合。

何か案は?

Module Header

  Type :: hello

      Integer :: a
      Integer :: b    
      Integer :: sum

    contains

      procedure, pass :: add => add_sub

  End type hello

  Interface

    Subroutine add_sub(this)
       Import hello
       Implicit None
       class(hello) :: this

    End Subroutine add_sub

  End Interface

End Module


Module Routines

  use Header

contains

  Subroutine add_sub(this)    
    Implicit None    
    class(hello), intent(inout) :: this
    this%sum=this%a+this%b    
  End Subroutine

End Module



Program Test

  use Header    
  use Routines

  Implicit None

  Type(hello) :: x

  x%a=1    
  x%b=2

  call x%add()

  write(*,*) x

End Program Test
4

2 に答える 2

1

あなたが抱えている問題は、Fortranコンパイラがすべてのモジュールプロシージャに明示的なインターフェイスを提供するため、コンパイラがadd_subプログラムの最上位スコープ内にある2つのインスタンスを検出することだと思いますtest

私はFortran2003標準を調べましたが、あなたが行ったことを禁止する規則をすぐに見つけることができません。しかし、それは珍しいことです。ルーチンの宣言と定義を別々のコンパイル単位に配置したいという衝動は、C / C ++プログラマーを、一般的なFortranプログラマーよりもはるかに苦しめているようです。

コーディングでこれらを分離したい場合は、次のオプションがあると思います。

  • サブルーチン定義をモジュールではないコンパイル単位に入れます。たとえば、モジュールを削除し、独自のコンパイルユニットにroutinesサブルーチンを含めることで、プログラムフラグメントをコンパイルできます。add_sub
  • includeステートメントを使用して、ルーチンが定義されているソースファイルのテキストを含めます。
  • コンパイラーがFortran2008のsubmodule機能を実装するのを待ちます。

私はこれを特に問題とは見なしていません。私は、型にバインドされたプロシージャの定義全体を、の宣言と同じコンパイル単位に配置することに慣れている、ありふれたFortranプログラマーの1人です。それらがバインドされているタイプ。

Fortran標準では、実行しようとしていることを禁止していないが、Intelコンパイラがまだ機能を実装していないか、正しく実装していない可能性があります。彼らの技術サポートの人々を通り越してこれを実行してみませんか、彼らは通常かなり良いです。

于 2012-06-18T13:32:29.267 に答える
0

ルーチンadd_subを 2 回定義しましたが、名前が互いに衝突しています。これは、 module の先頭に次の行を追加することで簡単に解決できますHeader

private add_sub

これにより、モジュールのプライベートな定義が作成add_subされるため、モジュールをインポートするルーチンから直接アクセスすることはできません。代わりに、パブリック インターフェイスを介してアクセスします。add

于 2012-06-18T08:33:41.697 に答える