3

iso_c_bindings モジュールを使用して Fortran 2003 バインディングを CUFFT ライブラリに書き込もうとしていますが、サブルーチンに問題があります( FFTW ライブラリcufftPlanManyと同様)。sfftw_plan_many_dft

バインディング自体は次のようになります。


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! cufftResult cufftPlanMany(cufftHandle *plan, int rank, int *n,
!                           int *inembed, int istride, int idist,
!                           int *onembed, int ostride, int odist,
!                           cufftType type, int batch)
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

interface cufftPlanMany
subroutine cufftPlanMany(plan, rank, n, &
                         inembed, istride, idist, &
                         onembed, ostride, odist, &
                         type, batch) &
& bind(C,name='cufftPlanMany')
use iso_c_binding
integer(c_int):: plan
integer(c_int),value:: rank, type, batch
integer(c_int):: n(*)
integer(c_int),value:: istride, idist, ostride, odist
integer(c_int):: inembed(*), onembed(*)
end subroutine cufftPlanMany
end interface cufftPlanMany

呼び出し部分は次のようになります。


  integer(c_int):: plan
  integer(c_int):: batch
  integer(c_size_t):: size

! ...

    call cufftPlanMany(plan, 1, size,&
                       0, 1, size,&
                       0, 1, size,&
                       CUFFT_C2C, batch)

残念ながら、これをコンパイルしようとすると、

エラー: (1) の一般的な 'cufftplanmany' に固有のサブルーチンはありません

コンパイル エラー。定数の代わりに変数を使用しようとしても役に立ちませんでした。これをデバッグするのを手伝ってもらえますか?

使用するコンパイラはgfortranです: GNU Fortran (Gentoo 4.4.5 p1.2, pie-0.4.5) 4.4.5

4

2 に答える 2

8

汎用 (名前付き) インターフェイスがあります。

エラー メッセージは通常、引数の一部が間違っていることを意味します。

一般に、呼び出したいジェネリック インターフェイスの特定のプロシージャがわかっている場合は、ジェネリック名ではなく、直接呼び出すようにしてください。どの引数が間違っているかを示す別のエラー メッセージが表示されます。そのためには、総称名と特定名を区別する必要があります。


あなたの特定のケース:

n, inembed, onembed配列として宣言するのはなぜですかint*integerFortranからそのまま渡されたのですか?intまた、 と を入れ替えてはいけませんsize_tsize_tは一般に 64 ビットとint32 ビットですが、一般的には同じではないため、区別する必要があります。

于 2011-11-08T08:34:12.327 に答える
4

インターフェイスとサブルーチンに別の名前を付けてみてください。つまり、インターフェイスの名前を変更してください。

于 2011-11-08T07:01:02.773 に答える