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

2024-10-01 22:30:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个封闭源共享库,其中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 **,但实际上在函数调用中给出了对{}的引用。

到目前为止,我已经:

^{pr2}$

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

但是在ctypes中(char (*)[MAX_PARAM_NAME])的演员是如何工作的呢?

如果有更直截了当的方法,我会很高兴听到的。


Tags: 代码name示例fooparammainctypesnull
2条回答

这里有pythonic的解决方法,我想分享一下完整性,虽然不好,但它很有效。在

# ParNumber is known, ParNameList is a string
pars = []                                                                                          
for i in range(ParNumber):                                                                        
    q = ParNameList[i*10:i*10+10]                                                                      
    q = q[:q.index('\0')]                                                                          
    print q                                                                                        
    pars.append(q)    

还是想知道,最好的办法是什么

您需要使用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))

之后你可能需要释放内存。在

相关问题 更多 >

    热门问题