Я пытаюсь получить некоторые данные из модуля, который является общим объектом, обернутым в ctypes.Данные представляют собой числовой массив, поэтому я использовал массив NumPy для хранения данных.Но я узнал, что я не понимаю, как numpy организует массив в памяти.
Если бы у меня была функция C, которая бы заполняла массив, как показано ниже:
int filler(int* a,int length){
int i=0;
for(i=0;i<length;i++){
a[i]=i;
}
return 0;
}
Тогда я бы вызвалэта функция в python с использованием ctypes
import ctypes
import numpy
lib = ctypes.cdll.LoadLibrary("libname")
data = numpy.zeros((1,10),dtype=numpy.int16)
lib.filler(data.ctypes.data,ctypes.c_int(10))
print data
Но мой вывод получается таким образом.
dtype=numpy.int16
[[0 0 1 0 2 0 3 0 4 0]]
Это имело бы смысл, если бы int был 32-битным, но я предполагаю, что C int - 16-битные (GCC в openSUSE на машине Intel x86).Я попытался запустить dtypes с 32 битами, и, как ни странно, я получил желаемый результат:
dtype=numpy.int32
[[0 1 2 3 4 5 6 7 8 9]]
Пытаясь понять, что происходит, я запустил int8 и получил следующее:
dtype=numpy.int8
[[0 0 0 0 1 0 0 0 2 0]]
Я посмотрел, посмотрел на обалденные документы, но до сих пор не нашел ответ.