用Cython包装C函数,生成NaN

时间:2018-02-07 12:31:42

标签: python c cython wrapper nan

我在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

0 个答案:

没有答案