问题
我正在尝试使用c库中的一个函数,其原型如下:
int glip_get_backends(const char ***name, size_t *count);
这里的name参数就是问题所在。它是一个通过引用传递的二维字符数组。在C中,函数使用如下:const char** name;
size_t count;
glip_get_backends(&name, &count);
for (size_t i = 0; i < count; i++) {
printf("- %s\n", name[i]);
}
现在我想从python使用ctypes来使用这个函数。
我试过的
对我来说,最合乎逻辑的方法是使用python:lglip = CDLL("libglip.so")
count = c_int(0)
backends = POINTER(POINTER(c_char))
lglip.glip_get_backends(byref(backends), byref(count))
导致错误信息TypeError: byref() argument must be a ctypes instance, not '_ctypes.PyCPointerType'
下一种方法是使用POINTER()函数三次,并省略byref(),但这会导致以下错误:ctypes.ArgumentError: argument 1: : Don't know how to convert parameter 1
然后我从this question中获得灵感,并得出以下结论:lglip = CDLL("libglip.so")
count = c_int(0)
backends = POINTER(POINTER(c_char))()
lglip.glip_get_backends(byref(backends), byref(count))
for i in range(0, count.value):
print backends[i]
由于某些原因,在backends的定义之后添加()已修复了该调用,但得到的输出是:< ctypes.LP_c_char object at 0x7f4592af8710 >
< ctypes.LP_c_char object at 0x7f4592af8710 >
在python中,我似乎无法使用一个iterator覆盖二维c数组,因为它没有正确地取消对它的引用。