cthon结构的cython内存视图

时间:2016-12-08 12:18:58

标签: c arrays python-2.7 cython

我正在尝试使用cython从一些二进制文件中提取数据,但是我遇到了一个问题,而我对cython / c的了解并不能解决它。

问题: 尝试对我的c数组结构进行内存视图会导致分段错误。

我在做什么: 我有一个装满数据的二进制文件,第一个条目是unsigned int,它给出了文件中包含的快照数(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 个答案:

答案 0 :(得分:1)

你必须告诉它长度:它无法计算出来自malloced数组的长度:

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

我怀疑它将-1解释为一个巨大的正整数(因此是分段错误)

仔细看看你的代码中还有另一个错误:

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

我删除了&前面的snap_info_array,并添加了一个演员void*(我不确定你是否需要演员表)。您告诉fread写入保存数组地址的位置,而不是写入阵列。