私の問題は、f2py でコンパイルすると、一部のモジュール変数がモジュール内で定義された関数によって認識されないことです。エラーは、関数に渡される引数の変数型が宣言されている場所で発生します ( の型を記述する変数real
、または次元要素など)。gfortran でコンパイルすると、このエラーは発生しません。f2py でコンパイルした場合の違いと、これらのエラーを修正するにはどうすればよいですか?
サンプル ファイル にmoddata.f90
は、次のコードが含まれています。
module mod
implicit none
integer, parameter :: dp = selected_real_kind(15)
integer, parameter :: nelem = 3
real(kind=dp), dimension(nelem) :: b
parameter (b=(/3,1,2/))
contains
function foo(x,y) result(z)
! dp, nelem are defined in module above
real(kind=dp), intent(in) :: x !scalar
integer, dimension(nelem), intent(in) :: y
! local variable
real(kind=dp) :: z
z = sum(b*y*x)
end function foo
end module mod
そして私はコンパイルします
f2py -c -m moddata moddata.f90
そして、私はこれらのエラーを受け取ります:
y_Dims[0]=(nelem);
^
1 warning and 1 error generated.reduce to a constant expression
integer, parameter :: nelem=3
前に再定義しinteger, dimension(nelem), intent(in) :: y
て再コンパイルすると、
real(kind=dp) foof2pywrap
1
Error: Parameter 'dp' at (1) has not been declared or is a variable, which does not reduce to a constant expression
real(kind=dp)
各宣言で同じエラーが発生し、
foof2pywrap = foo(x, y)
1
Warning: Possible change of value in conversion from REAL(8) to REAL(4) at (1)
dp
そのため、関数内でbyを再定義する必要integer, parameter :: dp = selected_real_kind(15)
があります。そして、それは機能します。
このモジュールを fortran ラッパーでコンパイルすると、これらのエラーは発生しません。なぜnelem
and dp
in the function が f2py で適切にスコープされていないのだろうか?