2016-12-08 14 views
2

私はいくつかのバイナリファイルからデータを抽出するためにcythonを使用しようとしていますが、私は問題を抱えており、cython/cの知識はそれを解決できません。構造体のC配列のcythonメモリビュー

問題: 私の構造体配列のメモリビューを作成しようとすると、セグメンテーション違反が発生します。

私がやっていること: 私はバイナリファイルがいっぱいです。最初のエントリはファイルに含まれるスナップショット(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

あなたはそれを長さを伝えるために持っている:それはmallocで割り当てられ、配列の長さをうまくすることはできません。

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

私はそれが-1などを解釈疑い巨大な正の整数(したがって、セグメンテーションフォルト)


さらに詳しく見ると、アノテーションあなたのコードでTHERバグ:

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

私はsnap_info_arrayの前で&を削除し、(私はあなたがが、キャストを必要とするかどうかわからないんだけど)void*にキャストを追加しました。 freadにあなたの配列ではなくあなたの配列のアドレスが保存されている場所に書き込むように言っていました。

+0

ありがとうDavidW、私はメモリビューを抽出し、np.asarray(snap_array_view)を使用して、Snapshot_Counterが長く表示されるようにしました。残念ながら、もし私がそれを印刷しようとすると、私はsegフォルトが発生します!だから、私は問題の底にいらっしゃらないと思う。 –

+0

@RDavies編集を参照してください。私はそれが他の唯一の問題だと約束するのは嫌いだが、それは確かにそれを修正したような、問題の – DavidW

+0

である。私はポインタ/アドレスのことに新しいです。あなたの明確な説明をありがとう。 の両方で動作し、配列名の前には何も表示されません。 –