我正在尝试将numpy数组传递给我想要更改数组值的C函数。但我必须将索引乘以2才能使其正常工作。将值分配给奇数索引(让它为i
)会导致为索引(i-1)/2
分配垃圾。这是源代码。
C:
#include "assign_array.h"
void assign(int *arr, int i) {
arr[i] = 2017;
}
的Python:
import ctypes, numpy
lib2 = ctypes.cdll.LoadLibrary('./assign_array.so')
for i in range(5):
array = numpy.zeros(8, dtype = int)
ptr = array.ctypes.data_as(ctypes.POINTER(ctypes.c_int))
print('i = {}:'.format(i))
lib2.assign(ptr, i)
print(array)
为什么会这样?
答案 0 :(得分:1)
垃圾:2047
为0x7e1
,8662949036032
为0x7E100000000
。看起来好像是在混合使用不同的C编译器(或者提供给C编译器的标志),因此Python认为int
是64位,但是你的C编译器认为int
是32位。实际上,虽然Python中的int
不能保证在C编译器中匹配int
;它通常更匹配long
。
根据the numpy documentation,dtype
可以指定为numpy.int32
,专门指代32位int
。这可能是处理此问题的最简单方法,当然您可以更改C代码以使用long
(假设C编译器的设置中为64位long
)。