用Cython包装一个C++结构体

3

我正在尝试使用Cython对以下头文件所写的C++动态链接库进行包装:

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

struct cmplx64
{
    float re;
    float im;
};

EXTERN_DLL_EXPORT int foo(cmplx64 *arr, int arr_sz);

PXD文件:
cdef extern from "mylib.h":

    cdef struct cmplx64:
        np.float64_t re
        np.float64_t im

    int foo(cmplx64 *arr, int arr_sz) except +

PYX文件:

cimport cmylib
import numpy as np
cimport numpy as np
import cython

def foo(np.ndarray[np.complex64_t, ndim=1] arr, int arr_sz):

    return cmylib.foo(&arr[0], arr_sz)

我的安装文件没有出现问题。

由于缺少struct定义,我尝试按照建议构建了一个cppclass,但是我没有像当前这种方法那样成功。

我收到的错误消息是:

Cannot assign type 'float complex *' to 'complexFloatStruct *'

我的问题是由于我正在使用的库的作者使用结构体定义了一个复杂类型,而不是简单地使用C++ std 库中内置的复杂类型。如果是这样,我就没有问题了。

然而,我认为将C++类或结构体包装成Cython应该是完全合理的。我已经仔细阅读了文档,但几乎失败了。感谢您的帮助!

1个回答

4
一个简单的强制类型转换可能就足够了。
def foo(np.ndarray[np.complex64_t, ndim=1] arr, int arr_sz):
    return cmylib.foo(<cmylib.cmplx64 *>&arr[0], arr_sz)

好主意,明天会尝试并告诉你。 - Trekkie
你好,你找到答案了吗?另一个问题是,如何在Python中创建传入参数arr - bactone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接