【发布时间】:2013-09-07 04:46:27
【问题描述】:
我的问题是使用 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 正确限定范围?
【问题讨论】:
标签: python fortran90 gfortran f2py