我正在尝试使用 cython 从一些二进制文件中提取数据,但我遇到了一个问题,我对 cython/c 的了解无法解决它。
问题: 尝试创建我的 c 结构数组的内存 View 会导致段错误。
我在做什么: 我有一个充满数据的二进制文件,第一个条目是一个无符号整数,给出了文件中包含的快照数 (Snapshot_Counter)。 接下来的条目采用 Snapshot_Information 格式,并且此 block 重复 Snapshot_Counter 次。 如果我在一个循环中逐 block 读取它,将结果存储在一个列表中,它会起作用,并且我会得到正确的数字。
我想通过一次性读入数组来避免这个循环。 我正在尝试将 Snapshot_Information 格式信息提取到一个数组中,我认为我已经设法正确分配了它。但是我无法弄清楚如何查看数组以检查我是否在其中获得了正确的数据。 我觉得这是错误的,因为我在这个 block 之后提取的数字是错误的。
我想知道的: 如何使用内存 View 查看此数组?我是否正确分配了内存?如果没有 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
最佳答案
你必须告诉它长度:它无法从分配的数组中算出长度:
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*
(我不确定你是否需要 Actor 虽然)。您告诉 fread
写入保存数组地址的位置,而不是写入数组。
关于c结构数组的cython内存 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41039360/