2016-12-08 22 views
2

我想用cython從一些二進制文件中提取數據,但是我遇到了一個問題,我對cython/c的知識無法解決它。c數組結構的cython內存視圖

問題: 試圖對我的c數組結構進行內存視圖導致分段錯誤。

我在做什麼: 我有一個充滿數據的二進制文件,第一個條目是一個無符號整數,給出文件中包含的快照數量(Snapshot_Counter)。 下一個條目採用Snapshot_Information格式,並且此塊重複執行Snapshot_Counter次。 如果我在循環中逐塊讀取它,將結果存儲在它的工作列表中,並獲得正確的數字。

我想通過一次讀取數組來避免這個循環。 我想提取Snapshot_Information格式信息到一個數組中,我想我已經設法正確地分配。然而,我不知道如何查看數組,以檢查是否有正確的數據。 我覺得這是錯誤的,因爲我在這個塊之後提取的數字是錯誤的。我想知道: 我怎樣才能看到這個數組與內存視圖?我是否正確地分配內存?有沒有一個C數組做這個的另一種方法?

代碼:

in extractiontest.pxd 

cdef unsigned int Snapshot_Counter 

cdef packed struct Snapshot_Information: 
    signed int Days 
    unsigned int Seconds 
    ...more type definitions. 


in extractiontest.pyx 

rm = fopen("/filepath") 

fread(&Snapshot_Counter,4,1,rm) #works fine 
cdef Snapshot_Information *snap_info_array = <Snapshot_Information *>malloc(Snapshot_Counter*sizeof(Snapshot_Information)) 
fread(&snap_info_array, sizeof(Snapshot_Information), Snapshot_Counter, rm) 

cdef Snapshot_Information[:] snap_arr_view = <Snapshot_Information[:-1]>snap_info_array 

回答

1

你要告訴它的長度:它不能從一個malloced陣列制定出一個長度:

cdef Snapshot_Information[:] snap_arr_view = <Snapshot_Information[:Snapshot_Counter]>snap_info_array 

我懷疑它解釋爲-1一個巨大的正整數(因此分段故障)


仔細一看,你也有ano療法在你的代碼的bug:

fread(<void*>snap_info_array, sizeof(Snapshot_Information), Snapshot_Counter, rm) 

我已經在前面snap_info_array取出&,並添加了強制轉換爲void*(我不知道,如果你需要投雖然)。您正在告訴fread寫入數組地址的地方,而不是數組。

+0

感謝DavidW,我設法讓它提取memoryview,然後使用np.asarray(snap_array_view)我可以看到它是Snapshot_Counter長。可悲的是,如果我嘗試打印它,我會遇到一個seg故障!所以我懷疑我沒有達到問題的底部。 –

+0

@RDavies請參閱編輯。我不想承諾這是唯一的其他問題,但它確實是一個問題 – DavidW

+0

優秀,似乎已經修復它。我是新來的指針/地址的東西。謝謝你的明確解釋。 它與一起工作,數組名前面沒有任何內容。 –