gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:13:15 27 4
gpt4 key购买 nike

我正在学习 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com