我尝试使用以下原型在c库中使用函数:
int glip_get_backends(const char ***name, size_t *count);
这里的name
参数是问题所在。它是通过引用传递的2个dimmensional char数组。在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]);
}
现在我想使用ctypes从python中使用这个函数。
对我来说最合乎逻辑的方法是在python中执行此操作:
lglip = CDLL("libglip.so")
count = c_int(0)
backends = POINTER(POINTER(c_char))
lglip.glip_get_backends(byref(backends), byref(count))
导致错误消息
TypeError:byref()参数必须是ctypes实例,而不是&#39; _ctypes.PyCPointerType&#39;
下一种方法是使用POINTER()
函数三次并省略byref()
,但这会导致以下错误:
ctypes.ArgumentError:参数1 ::不知道如何转换参数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
由于某种原因我无法完全理解已经修复了调用,但我获得的输出是:
&LT; ctypes.LP_c_char对象位于0x7f4592af8710&gt;
&LT; ctypes.LP_c_char对象位于0x7f4592af8710&gt;
我似乎无法在python中使用一个itterator对2维c数组进行迭代,因为它没有正确地取消引用它。
答案 0 :(得分:4)
在意识到在C实现CREATE TABLE tbl (
col1 TEXT,
col2 INTEGER,
CHECK ( my_validate_func(row_to_json(tbl.*)))
);
用于迭代子字符串后,我提出了以下工作解决方案:
%s
更新:将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))()
,建议为eryksun。这样我就可以轻松访问字符串。
答案 1 :(得分:-1)
如果后端成员可以使用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")])
方法,则可以使用以下代码:
$array = array(
'kk6NFKK'=>'name',
'nnbDDD'=>'claGg',
'nnbDDD'=>'kaoOPOP',
'nnbDDD'=>'JWIDE4',
'nnbDDD'=>'lopO'
);
print_r(each($array));