在 Python 中包装了 C 库,但返回的数组未更改
Wrapped C library in Python, but returned array is unchanged
这是我第一次尝试使用 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,但是数据内容没有变化。我已经看过了,还是找不到原因。
此代码:
data_array = ctypes.c_uint8 * len(data)
result = myfunc(data_array(*data),ctypes.c_uint8(len(data)))
在名为 data_array
.
的 ctypes 数组类型实例中创建 data
的匿名副本
当您将您匿名创建的 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]
它打印出传递给函数的同一个数组,并确保你传递的数组是命名的而不是匿名的。
这是我第一次尝试使用 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,但是数据内容没有变化。我已经看过了,还是找不到原因。
此代码:
data_array = ctypes.c_uint8 * len(data) result = myfunc(data_array(*data),ctypes.c_uint8(len(data)))
在名为 data_array
.
data
的匿名副本
当您将您匿名创建的 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]
它打印出传递给函数的同一个数组,并确保你传递的数组是命名的而不是匿名的。