Я пытаюсь использовать cython для извлечения данных из некоторых двоичных файлов, но я сталкиваюсь с проблемой, и мои знания о cython/c не могут ее решить.cython memory view 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
Thanks DavidW, мне удалось получить его для извлечения памяти, а затем, используя np.asarray (snap_array_view), я вижу, что это Snapshot_Counter long. К сожалению, если я попытаюсь распечатать любой из них, я получаю ошибку seg! Поэтому я подозреваю, что у меня нет проблемы. –
@RDavies См. Редактирование. Я не хотел бы обещать, что это единственная проблема, но это, безусловно, проблема – DavidW
отлично, что, похоже, исправило ее. Я новичок в указателях/адресах. Благодарю за ваше четкое объяснение. Он работает как с, так и перед именем массива. –