Ctypes读取修改后的数组
Ctypes reading modified array
这些是 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]
我在读取输出时做错了什么?
*a
in Python 已经失去对原始数组的跟踪;相反,它创建了一个新的不可变 tuple 数组元素对象,并且这个元组作为位置参数传递给 array_type
对象构造函数,这使得 another,可变数组对象。正是这个对象在 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))
这些是 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]
我在读取输出时做错了什么?
*a
in Python 已经失去对原始数组的跟踪;相反,它创建了一个新的不可变 tuple 数组元素对象,并且这个元组作为位置参数传递给 array_type
对象构造函数,这使得 another,可变数组对象。正是这个对象在 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))