2013-01-24 42 views
1

我有C++庫,其功能是從python側調用的。上述功能之一得到一個陣列上的指針,其在蟒側在[0:255]具有值並將其定義爲使用ctypes從python到C++的數據傳輸

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,序列1,我越來越遠高於無符號短範圍的值和零序列沒有用零填充。 編譯進行得很順利,但實際運行會導致分段錯誤。 我哪裏錯了?

+0

您的第一個問題幾乎可以肯定是@WarrenWeckesser指出的,即您將1字節值的數組視爲2字節值。但最重要的是,請注意,'ctypes.data''可能包含未對齊的數據,或者未包含正確的字節順序......甚至可能無法寫入。「換句話說,即使它是'uint16'數組,你也不能將它傳遞給'ushort *'而不檢查任何東西。 – abarnert

回答

3

ushort是2個字節,並且numpy.uint8是1個字節。

+0

這並不能解釋零不是零,儘管... – Jaime

+2

@Jaime:當然會。想象一下一個非常簡單的2x2圖像。因此,'seq.ctypes.data'是一個包含四個'uint8'值的數組:[[00,00,00,00]](十六進制)。當你解釋這是一個由四個'ushort'值組成的數組時,它是'[0000,00000,]'。隨機垃圾是堆中下一次發生的情況,它可以很容易地爲非零值。 (或者,當然,它可以超過分配區域的末尾和段錯誤。) – abarnert

+0

第一個(w * h * 3)/ 2值爲零嗎? –

相關問題