我遇到的问题是使用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, dimension(nelem), intent(in) :: y
之前重新定义 integer, parameter :: nelem=3
并重新编译,会得到以下错误:
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)
因此,我需要在函数中通过 integer, parameter :: dp = selected_real_kind(15)
重新定义 dp
。然后就可以工作了。
当我使用 Fortran 包装器编译这个模块时,我不会遇到这些错误。我想知道为什么函数中的 nelem
和 dp
在 f2py 中没有适当地分配作用域?
foo
。 - hatmatrixdp
和nelem
的附加声明,则它可以工作,因此模块+包含表单确实有效。 - hatmatrixnelem
和dp
,我就能让我的函数运行起来,而不必将其转换为子程序。我能够访问b
而无需重新定义它。最好的情况是,这种行为是不可预测的。好吧,f2py结果有点令人失望。 - hatmatrix