У меня есть библиотека 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 ответ
ushort
- 2 байта, а numpy.uint8
- 1 байт.
seq.ctypes.data
- это массив из четырех значений uint8
: [00, 00, 00, 00]
(в шестнадцатеричном формате). Когда вы интерпретируете, что это массив из четырех значений ushort
, это [0000, 0000, <random garbage>, <random garbage>]
. Этот случайный мусор - это то, что окажется следующим в куче, что легко может иметь ненулевые значения. (Или, конечно, он может пройти за конец выделенной области и сегмент.)
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
ctypes.data
«может содержать данные, которые не выровнены или находятся в неправильном порядке байтов… могут даже быть недоступны для записи». Другими словами, даже если бы это был массивuint16
, вы не можете просто передать его вushort *
, ничего не проверив.