私はいくつかのバイナリファイルからデータを抽出するために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
ありがとうDavidW、私はメモリビューを抽出し、np.asarray(snap_array_view)を使用して、Snapshot_Counterが長く表示されるようにしました。残念ながら、もし私がそれを印刷しようとすると、私はsegフォルトが発生します!だから、私は問題の底にいらっしゃらないと思う。 –
@RDavies編集を参照してください。私はそれが他の唯一の問題だと約束するのは嫌いだが、それは確かにそれを修正したような、問題の – DavidW
である。私はポインタ/アドレスのことに新しいです。あなたの明確な説明をありがとう。の両方で動作し、配列名の前には何も表示されません。 –