c++ - 如何使用 cytpes 将 int 列表的列表从 python 传递给 C++ 函数

标签 c++ python-3.x ctypes

我正在学习 c++(我已经学习了大约 48 个小时,所以请原谅可能的无知),目的是加快一些缓慢的 python 代码的速度。我编写的C++函数如下;

std::tuple<float*, int*, int*, int**> scoreS(int**, float***, int**, float**, float**, float**, float**, float**, float**, float*, float**);

在我的 python 文件中,我执行以下操作;

tmpScoreLib = cdll.LoadLibrary('/ScorerPT2.dll')
tmpScoreLib.ScoreSWrapped.argtypes = [POINTER(POINTER(c_int)), POINTER(POINTER(POINTER(c_float))), POINTER(POINTER(c_int)), POINTER(POINTER(c_float)), POINTER(POINTER(c_float)), POINTER(POINTER(c_float)), POINTER(POINTER(c_float)), POINTER(POINTER(c_float)), POINTER(POINTER(c_float)), POINTER(POINTER(c_float)), POINTER(POINTER(c_float))]

tmpvals1, tmpvals2, tmpvals3, tmpvals4 = tmpScoreLib.ScoreSWrapped(val1,val2,val3,val4,val5,val6,val7,val8,val9,val10,val11)

我使用 ScoreSWrapped 作为 ScoreS 函数的包装函数 as per this question

但是,当我尝试运行此程序时,出现以下错误:

ArgumentError: argument 1: <class 'TypeError'>: expected LP_LP_c_long instance instead of list

这是因为 val1 是 float 列表的列表,而不是指向整数指针列表的指针(我假设?)我不明白的是如何从具有python 中 int 列表的列表,以便能够将所需的 int** 传递给 c++ 函数。这是我第一次尝试这种类型的 C++ 包装器,所以我可能会做很多错误的事情 - 假设我完全无知!我发现了其他问题,他们要么使用 ctype.cast 要么 ctypes.byref,但我无法真正理解如何应用这些。

最佳答案

您必须手动创建要传递的数组。 ctypes supports this当然,但是您不能只提供 Python 列表。对于作为指向指针的指针实现的多维数组,您必须在每个级别保留对每个数组的引用(以保持它们的事件状态)并将它们的地址复制到“包含”数组中。

最后,您无法使用 ctypes 解压 std::tuple;您必须创建一个自定义结构类型(或者通过更多指针返回这些值)。在 C 中进行转换可能比将所有内容转换为与 ctypes 兼容的形式更容易。

关于c++ - 如何使用 cytpes 将 int 列表的列表从 python 传递给 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60027324/

相关文章:

c++ - TCHAR 指针初始化

python - 无法在 PyCharm 中安装 PyTorch (Python 3.9/macOS)

c++ - 为什么while中的循环计数器超出了整型变量的范围,所以不是无限循环?

c++ - QPushButton 视觉问题

python - 在列表理解中使用 sum() 时出错

python - 如何使用 python 生成二维码并在扫描时使其打开定义的 url?

python - Ctypes:获取指向结构体字段的指针

python - ctypes 如何知道何时抛出 ArgumentError,但只是有时?

python - ctypes.create_string_buffer Python 2 与 Python 3

C++教程似乎不对