0

我有一个需要char const **参数的 C 库函数,例如:

void set_values(void* object, char const ** values, int dim1, int dim2);

where是一个指向空终止字符串值values的长度数组。dim1*dim2

当我尝试使用 cffi/ctypes 调用此函数时,下面的 Python 代码会导致错误:

LP_c_char  = ctypes.POINTER(ctypes.c_char)

dim1 = 2
dim2 = 3
values = ('1.0', '2.0', '1.2', '2.2', '1.5', '2.5')

values_ptr = (LP_c_char * (dim1 * dim2))()
for i, value in enumerate(values):
    values_ptr[i] = ctypes.create_string_buffer(value.encode('utf-8'))

mylib.set_values(object, values_ptr, dim1, dim2)

结果是以下错误mylib.set_values(...)

TypeError: initializer for ctype 'char * *' must be a cdata pointer, not LP_c_char_Array_6

遗憾的是values不能是double*数组,因为库接受变量名和表达式。

我正在关注这个旧线程。我正在使用 Python 3.7.2 和 cffi 1.14.0。

有人可以指出我在这里做错了什么吗?

4

2 回答 2

1

你不能像那样混合 ctypes 和 cffi。它们是两个不同的项目。在这种情况下,您尝试调用 cffi 公开的函数,但传递的是 ctypes 对象的参数。尝试构建 cffi 对象,例如使用ffi.new().

于 2020-06-24T14:34:27.060 回答
0

按照接受的答案建议,我在 cffi 文档中找到了一个解决问题的示例。分享给其他可能有同样问题的人。

dim1 = 2
dim2 = 3
values = ('1.0', '2.0', '1.2', '2.2', '1.5', '2.5')

values_ptr = [ffi.new("char[]", bytes(value, encoding="utf-8")) for value in values]

mylib.set_values(object, ffi.new("char *[]", values_ptr), dim1, dim2)
于 2020-06-24T23:17:10.753 回答