У меня есть библиотека c ++, функции которой вызываются со стороны python. Одна из функций получает указатель на массив, который на стороне Python имеет значения в [0: 255] и определяется как

 seq1=numpy.array(image,dtype=numpy.uint8).flatten()
 seq=numpy.zeros((w*h*3),dtype=numpy.uint8)

Вызов функции идет как

myCppFunction(ctypes.c_void_p(seq.ctypes.data),
                     ctypes.c_void_p(seq1.ctypes.data), 
...)

На стороне C ++ функция, определенная как

void myCppFunction(ushort *seq, ushort *sequence1, ...)

Когда я просто печатаю то, что я получаю на стороне C ++ как seq, sequence1, я получаю значения, намного превышающие беззнаковый короткий диапазон, и последовательность нулей не заполняется нулями. Компиляция проходит нормально, но реальный запуск приводит к ошибке сегментации. Где я не прав?

1
cur4so 25 Янв 2013 в 01:03
Ваша первая проблема здесь почти наверняка связана с тем, что указал @WarrenWeckesser, что вы обрабатываете массив 1-байтовых значений, как если бы они были 2-байтовыми значениями. Но, кроме того, обратите внимание, что ctypes.data «может содержать данные, которые не выровнены или находятся в неправильном порядке байтов… могут даже быть недоступны для записи». Другими словами, даже если бы это был массив uint16, вы не можете просто передать его в ushort *, ничего не проверив.
 – 
abarnert
25 Янв 2013 в 01:41

1 ответ

Лучший ответ

ushort - 2 байта, а numpy.uint8 - 1 байт.

3
Warren Weckesser 25 Янв 2013 в 01:13
2
@ Хайме: Конечно, будет. Представьте себе очень простое изображение 2x2. Итак, seq.ctypes.data - это массив из четырех значений uint8: [00, 00, 00, 00] (в шестнадцатеричном формате). Когда вы интерпретируете, что это массив из четырех значений ushort, это [0000, 0000, <random garbage>, <random garbage>]. Этот случайный мусор - это то, что окажется следующим в куче, что легко может иметь ненулевые значения. (Или, конечно, он может пройти за конец выделенной области и сегмент.)
 – 
abarnert
25 Янв 2013 в 01:38
Являются ли первые (w * h * 3) / 2 значения равными нулю?
 – 
Warren Weckesser
25 Янв 2013 в 01:38
Да, полностью согласен. Мое плохо выраженное мнение заключалось в том, что вы все равно должны видеть некоторые нули.
 – 
Jaime
25 Янв 2013 в 02:37
Вы правы насчет несоответствия байтов, мне нужно изменить ushort на unsigned char (изображения соответствуют numpy.uint8, поэтому это необходимо сохранить). Спасибо
 – 
cur4so
25 Янв 2013 в 03:02