如果我有以下两组代码,我该如何将它们粘合在一起?
void
c_function(void *ptr) {
int i;
for (i = 0; i < 10; i++) {
printf("%p", ptr[i]);
}
return;
}
def python_routine(y):
x = []
for e in y:
x.append(e)
如何在x中使用连续的元素列表调用c_function?我试图将x转换为c_void_p,但这不起作用。
我也尝试使用像
这样的东西x = c_void_p * 10
for e in y:
x[i] = e
但这会出现语法错误。
C代码显然需要数组的地址。我如何实现这一目标?
答案 0 :(得分:70)
以下代码适用于任意列表:
import ctypes
pyarr = [1, 2, 3, 4]
arr = (ctypes.c_int * len(pyarr))(*pyarr)
答案 1 :(得分:8)
>>> IntArray5 = c_int * 5
>>> ia = IntArray5(5, 1, 7, 33, 99)
答案 2 :(得分:6)
这是对已接受答案的解释。
ctypes.c_int * len(pyarr)
创建长度为4(python3,python 2)的类型c_int
的数组(序列)。由于c_int
是一个其构造函数使用一个参数的对象,因此(ctypes.c_int * len(pyarr)(*pyarr)
对c_int
中每个pyarr
实例进行一次初始化。 easier to read表单是:
pyarr = [1, 2, 3, 4]
seq = ctypes.c_int * len(pyarr)
arr = seq(*pyarr)
使用type
函数查看seq
和arr
之间的区别。
答案 3 :(得分:1)
import ctypes
import typing
def foo(aqs : typing.List[int]) -> ctypes.Array:
array_type = ctypes.c_int64 * len(aqs)
ans = array_type(*aqs)
return ans
for el in foo([1,2,3]):
print(el)
这将给出:
1
2
3