我正在尝试使用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
答案 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
写入保存数组地址的位置,而不是写入阵列。