这些是C文件:
addone.h
#ifndef __ADDONE
#define __ADDONE
void addone(float *in_data, int size);
#endif
addone.c
void addone(float *in_data, int size)
{
int i = 0;
for(int i = 0; i < size; i++)
{
in_data[i] = in_data[i] + 1;
}
}
我正在尝试将此功能与Ctypes一起使用:
import ctypes
libaddone = ctypes.cdll.LoadLibrary("libaddone.so")
libaddone.addone.argtypes = (ctypes.POINTER(ctypes.c_float), ctypes.c_int)
a = [1,2,3]
array_type = ctypes.c_float * 3
libaddone.addone(array_type(*a), ctypes.c_int(3))
print a
但我对a
:[1,2,3]
阅读输出时我做错了什么?
答案 0 :(得分:2)
*a
已经失去对原始数组的跟踪;相反,它创建了一个新的不可变的元组数组元素的对象,这个元组作为位置参数传递给array_type
对象构造函数,这使得另一个,可变数组对象。而且这个对象在addone
中得到修改。
你可以尝试
import ctypes
libaddone = ctypes.cdll.LoadLibrary("libaddone.so")
libaddone.addone.argtypes = (ctypes.POINTER(ctypes.c_float), ctypes.c_int)
a = [1,2,3]
array_type = ctypes.c_float * 3
my_array = array_type(*a)
libaddone.addone(my_array, ctypes.c_int(3))
print(list(my_array))