gpt4 book ai didi

python - ctypes:将指向 char 的指针分解/转换为指向 char 的指针数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:33 27 4
gpt4 key购买 nike

我正在使用一个闭源共享库,其中包含 C++ 中的示例代码,如下所示:

// Header
#define MAX_PARAM_NAME 10
int foo(..., char **ParNameList, ...);

// Main
char *ParNameList = (char *)NULL;
ret = foo(..., &ParNameList,...);
par = (char (*)[MAX_PARAM_NAME])ParNameList;

在ctypes中应该如何处理?

有问题的部分是在函数声明 foo(..., char **ParNameList, ...); 中需要一个 char ** ,但是对 char * 的引用实际上是在函数调用中给出的。

到目前为止我有:

from ctypes import *
so = cdll.LoadLibrary(...)
so.foo.argtypes = [
...
POINTER(POINTER(c_char)), # ParNameList
...
]
so.foo.restype = c_int

#...
ParNameList = POINTER(c_char)()
so.foo(..., ParNameList ,...)

这给了我一个垃圾字符串,我看到所需的输出与随机变化的 RAM 位交错。

但是 (char (*)[MAX_PARAM_NAME]) 在 ctypes 中如何转换?

如果整个事情有更直接的方法,我将不胜感激。

最佳答案

您需要使用 byref 传递 c_char 指针的地址:

foo.argtypes = [..., POINTER(POINTER(c_char)), ...]
foo.restype = c_int

par_name_list = POINTER(c_char)()

# pass by reference
foo(byref(par_name_list))

par = cast(par_name_list, POINTER(c_char * MAX_PARAM_NAME))

之后您可能需要释放内存。

关于python - ctypes:将指向 char 的指针分解/转换为指向 char 的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50985762/

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