4

我正在尝试包装一个具有很多这样的功能的头文件

测试.h

void test(int N, int* data_in, int* data_out);

这样我就可以使用 numpy.

现在我有以下 cython 代码:

测试.pyx

import numpy as np
cimport numpy as np

ctypedef np.int_t itype_t

cdef extern from 'VolumeForm.h':
    void _test 'test' (int, int*, int*)

def wrap_test(np.ndarray[itype_t, ndim=2] data):
    cdef np.ndarray[dtype_t, ndim=1] out
    out = np.zeros((data.shape[0],1), dtype=np.double)
    _test(
        data.shape[0],
        <itype_t*> data.data,
        <itype_t*> out.data
    )
    return out

但是,当我尝试编译它时,我得到了错误:

Error converting Pyrex file to C:
(...)
Cannot assign type 'test.itype_t *' to 'int *'

我怎样才能解决这个问题?

4

2 回答 2

4

这个问题目前正在 Cython 邮件列表中讨论;显然它源于一个 Cython 库中的一个小错误:

http://codespeak.net/mailman/listinfo/cython-dev

目前,一种可能的解决方法是使用 dtype np.long 的 NumPy 数组,然后改为编写“ctypedef np.long_t itype_t”。然后你只需要让 C 代码对长整数而不是整数感到满意。

于 2009-12-27T21:51:44.263 回答
2

另一种不需要您将内容从ints 更改为longs 的解决方法:更改块中的函数签名cdef extern from '...'。Cythoncdef extern仅在生成文件时使用块中的声明来检查类型.c,但生成的 C 代码仅执行#include "VolumeForm.h",因此您可以摆脱它。

import numpy as np
cimport numpy as np

ctypedef np.int_t itype_t

cdef extern from 'VolumeForm.h':
    # NOTE: We changed the int* declarations to itype_t*
    void _test 'test' (int, itype_t*, itype_t*)

def wrap_test(np.ndarray[itype_t, ndim=2] data):
    cdef np.ndarray[dtype_t, ndim=1] out
    out = np.zeros((data.shape[0],1), dtype=np.double)
    _test(
        data.shape[0],
        <itype_t*> data.data,
        <itype_t*> out.data
    )
    return out

Cython 没有抱怨上述内容。

于 2011-02-19T20:01:51.680 回答