Ctypes读取修改的数组

2024-10-04 07:30:52 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是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]

在读取输出时,我做错了什么?你知道吗


Tags: 文件indatasizetypefloatctypesarray
1条回答
网友
1楼 · 发布于 2024-10-04 07:30:52

Python中的*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))

相关问题 更多 >