用Python包装C库,但返回的数组不变

用Python包装C库,但返回的数组不变,python,pointers,ctypes,Python,Pointers,Ctypes,这是我第一次尝试使用Ctypes。我有一个C dll,它可以进行简单的缓冲区操作,将1添加到它的内容中 extern "C" { __declspec(dllexport) int AddBuffer(unsigned char* data, unsigned char len) { int i = 0; int sum = 0; for (i = 0; i < len; i++) {

这是我第一次尝试使用Ctypes。我有一个C dll,它可以进行简单的缓冲区操作,将1添加到它的内容中

extern "C"
{
    __declspec(dllexport) int AddBuffer(unsigned char* data, unsigned char len)
    {
        int i = 0;
        int sum = 0;
        for (i = 0; i < len; i++)
        {
            sum = sum + data[i];
            data[i] = data[i] + 1;
        }

        return sum;
    }
}
我得到的结果是42,但数据内容保持不变。我已经查看了,但仍然找不到原因。

此代码:

在名为
data\u array
的ctypes数组类型的实例中创建
数据的匿名副本

当您将匿名创建的
data\u数组
实例传递给正在修改的函数时,即新副本

相反,您需要:

data = [1,2,3,4,5,8,4,6,9]
myfunc = test_dll.AddBuffer
myfunc.argtypes = (ctypes.POINTER(ctypes.c_uint8),ctypes.c_uint8)
data_array = ctypes.c_uint8 * len(data)
arg = data_array(*data)
result = myfunc(arg,ctypes.sizeof(arg))
print result
for i in range (0,len(arg)):
     print  arg[i]

它打印出传入函数的相同数组,并确保传入的数组命名为匿名数组。

看起来您是在修改
数据数组(*data)
的结果,而不是实际修改
数据本身。
data\u array
的内容是否会更改?@spiffman这就是问题所在,但是
data\u array
是一种类型,而不是该类型的实例。您好,感谢这一点,我的理解是,data\u array是一种分配的内存,正好有9个字节,其中充满了数据内容。但当我尝试打印数据数组时,我发现它不可编辑。因此,这里arg和data_array的区别在于
data_array
是类型
uint8[9]
的python表示。这与普通python中没有ctypes的类和类的实例之间的区别是一样的
arg
是在我的示例中复制
data
到的类型的实例
data_array = ctypes.c_uint8 * len(data)
result = myfunc(data_array(*data),ctypes.c_uint8(len(data)))
data = [1,2,3,4,5,8,4,6,9]
myfunc = test_dll.AddBuffer
myfunc.argtypes = (ctypes.POINTER(ctypes.c_uint8),ctypes.c_uint8)
data_array = ctypes.c_uint8 * len(data)
arg = data_array(*data)
result = myfunc(arg,ctypes.sizeof(arg))
print result
for i in range (0,len(arg)):
     print  arg[i]