2017-07-20 9 views
2

F2PYを使用して関数と仮定形状配列を引数とするFortranサブルーチンをラップしようとしています。これによりエラーが発生します。私はGNU Fortran(GCC)4.8.5 20150623(Red Hat 4.8.5-11)とScientific Linux 7.3のF2PYバージョン2を使用しています。私は、これは(ドイツ語から翻訳され、次のエラーが発生しコールバック引数と仮定した形状の配列引き数を持つサブルーチンを持つF2PY

f2py -m pymod -h sign.pyf callback.f90 
f2py -c sign.pyf callback.f90 

とターミナルでラップ

!file callback.f90 
subroutine sub(arr,func) 
implicit none 
    integer,intent(in),dimension(:) :: arr 
    external func 
    integer :: func 
    integer :: i 

    i = arr(1) 
    print *, func(i) 
end subroutine sub 

最小限の例では、ファイル「callback.f90」になります):

gfortran:f77: /usr/tmp/tmpsADmTS/src.linux-x86_64-2.7/pymod-f2pywrappers.f 
/usr/tmp/tmpsADmTS/src.linux-x86_64-2.7/pymod-f2pywrappers.f:6.19: 

      use sub__user__routines         
       1 
Error: Module file »sub__user__routines.mod« at (1) can't be opened 
     for reading: File not found 

ただし、これは完璧ですy fine、の場合は形状ではなく固定サイズです。想定された形状の配列を持つF2PYもコールバック引数が含まれていない限り、私にとってうまくいきます。したがって、問題はこれら2つの間の相互作用のように思われます。

+1

関連する場合は、この最近の質問を参照してください。https://stackoverflow.com/questions/44073679/errors-when-using-a- fortran-call-back-function-in-f2pyこのサイトでさらに検索してみてください。残念ながら、f2pyはこの領域では理想的ではありません。 –

+0

@VladimirF:ありがとう、私はこれが関連しているとは思わないが、私のエラーはコールバック引数と形状配列が両方とも使用されている場合にのみ発生するためです。 –

+0

代わりに 'dimension(*) 'を使ってみましたか? – percusse

答えて

0

想定形状の仮引数は、ほとんどの(すべての)Fortranコンパイラで記述子(ドープベクトルとも呼ばれます)を使用して実装されています。これは、あなたの例のサブルーチンsubの最初の引数(arr)が単に配列のアドレスではないことを意味します。配列データのアドレスと配列境界情報などを含む構造体のアドレスです。私はF2PYの内部の仕組みに精通していませんが、おそらくディスクリプタの引数をサポートしていませんか? (by-descriptor引数の他の例は、POINTER属性またはALLOCATABLE属性を持つ引数です)。

+0

f2pyでサポートされている形状配列AREを仮定します。 –

関連する問題