Python中包装的C库,但返回的数组未更改

时间:2016-04-07 15:55:30

标签: 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++)
        {
            sum = sum + data[i];
            data[i] = data[i] + 1;
        }

        return sum;
    }
}

在我的python代码中我有

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)
result = myfunc(data_array(*data),ctypes.c_uint8(len(data)))
print result
for i in range (0,len(data)):
     print  data[i]

我得到的结果是42,但数据内容保持不变。我看了但仍然找不到原因。

1 个答案:

答案 0 :(得分:1)

此代码:

data_array = ctypes.c_uint8 * len(data)
result = myfunc(data_array(*data),ctypes.c_uint8(len(data)))

在名为data的ctypes数组类型的实例中创建data_array的匿名副本。

当您传递data_array实例时,您匿名创建了正在修改的内容,即新副本。

相反,你需要:

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]

打印出传入函数的相同数组,并确保传入的数组是命名而不是匿名。