我在C
代码中有一个返回double
的函数。
为了制作一个可重复的例子,我将以下列方式极其简化。在.c
文件中:
double myfunction_at_k_and_z(struct background * pba,
struct spectra * psp,
struct perturbs *ppt,
double k,
double z,
double * pk_ic)
{
double result = 3.;
return result;}
在.h
文件中:
double myfunction_at_k_and_z (struct background * pba,
struct spectra * psp,
struct perturbs *ppt,
double k,
double z,
double * pk_ic);
并且一切运行良好,输出result
是我期待的,我可以使用,例如函数内fprintf
在屏幕上打印result
的值,看起来不错。
现在我想使用Python
使用Cython
包装器包装此函数。在.pyx
文件中,我在类myclass
中创建了此函数:
def get_myfunction_at_k_and_z(self, double k, double z):
cdef double dummy
cdef double result = myfunction_at_k_and_z(&self.ba, &self.sp, &self.pt, k, z, &dummy)
return result
并在.pxd
文件中声明:
double myfunction_at_k_and_z (background * pba, spectra * psp, perturbs *ppt, double k, double z, double * pk_ic)
以便包装器知道C
中的原始函数。这很好地编译,但如果现在我从myfunction_at_k_and_z
调用Python
,则值为{ k = 0.1, z = 1.
通过
myclass.get_myfunction_at_k_and_z(0.1,1.)
此函数打印nan
!!!
这很奇怪,为什么它适用于C
但不适用于Python
?