首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python类型,通过引用传递双指针。

python类型,通过引用传递双指针。
EN

Stack Overflow用户
提问于 2015-05-19 11:47:09
回答 2查看 9.5K关注 0票数 5

问题

我试图在c库中使用一个函数,其原型如下:

int glip_get_backends(const char ***name, size_t *count);

这里的name参数就是问题所在。它是一个通过引用传递的2个酒体字符数组。在C中,该函数的用法如下:

代码语言:javascript
复制
const char** name;
size_t count;
glip_get_backends(&name, &count);
for (size_t i = 0; i < count; i++) {
    printf("- %s\n", name[i]);
}

现在,我想使用ctype从python中使用这个函数。

我试过的

对我来说,最符合逻辑的方法是在python中这样做:

代码语言:javascript
复制
lglip = CDLL("libglip.so")
count = c_int(0)
backends = POINTER(POINTER(c_char))
lglip.glip_get_backends(byref(backends), byref(count))

导致错误消息。

TypeError: byref()参数必须是ctype实例,而不是'_ctypes.PyCPointerType‘

下一种方法是三次使用POINTER()函数并省略byref(),但这会导致以下错误:

ctypes.ArgumentError:参数1::不知道如何转换参数1

然后,我从this question那里得到了灵感,并提出了以下建议:

代码语言:javascript
复制
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定义之后添加backends已经修正了调用,但我得到的输出是:

< ctypes.LP_c_char对象在0x7f4592af8710 > < ctypes.LP_c_char对象在0x7f4592af8710 >

我似乎不能在python中使用一个itterator在二维c数组上进行测试,因为它没有正确地取消引用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-19 12:04:40

在意识到在C实现中,%s习惯于对子字符串进行itterate操作之后,我想出了以下工作解决方案:

代码语言:javascript
复制
lglip = CDLL("libglip.so")
count = c_int(0)
backends_c = POINTER(c_char_p)()
lglip.glip_get_backends(byref(backends_c), byref(count))
backends = []
for i in range(0, count.value):
    backends.append(backends_c[i])
print backends

更新:将POINTER(POINTER(c_char))()更改为POINTER(c_char_p)(),正如eryksun建议的那样。这样我就可以轻松地访问字符串。

票数 6
EN

Stack Overflow用户

发布于 2015-05-19 12:31:16

如果后端成员可以使用index方法,则可以使用以下代码:

代码语言:javascript
复制
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 ''.join(backends[i][:backends[i].index("0")])
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30324758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档