c++ - 在 Cython 中包装 C++ 结构

标签 c++ python-3.x cython

我正在尝试使用以下头文件用 Cython 包装一个用 C++ 编写的 dll:

#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 库中的内置复杂类型。如果是这样的话,我就没有问题了。

但是,我应该能够用 Cython 包装 C++ 类或结构似乎是完全合理的。我已经阅读了文档并且几乎失败了。感谢您的帮助!

最佳答案

一个简单的转换可能就足够了,

def foo(np.ndarray[np.complex64_t, ndim=1] arr, int arr_sz):
    return cmylib.foo(<cmylib.cmplx64 *>&arr[0], arr_sz)

关于c++ - 在 Cython 中包装 C++ 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38361302/

相关文章:

python - pandas如何检查每组中列值之间的差异是否在范围内

python - 合并两个文件中的行(如果它们具有相同的列值)

python - 在python中同时运行交互函数

scope - 为什么 Cython 强制在函数开头声明局部变量

multithreading - 在 cython 中并行化 for 循环 : beyond prange

检查一个值是否存在于 Cython 的数组中

C++ 将类型作为未知类函数的参数?

c++ - 如何在谷歌日历中创建一个计数器

c++ - 处理构造函数的条件参数

c++ - LPCSTR- 如何检查第一个位置是否为空格 ""