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))