2016-12-08 4 views
2

Я пытаюсь использовать 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 

ответ

1

Вы должны сказать ему длину: она не может работать в длину от malloced массива:

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

Я подозреваю, что он интерпретирует -1, как огромное целочисленное целое число (отсюда и ошибка сегментации)


При внимательном рассмотрении вы также имеете ano ошибка в ь еще код:

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

я удалил & перед snap_info_array и добавил бросок к void* (я не уверен, что если вам нужно бросание, хотя). Вы писали fread, чтобы написать в том месте, где хранился адрес вашего массива, а не в ваш массив.

+0

Thanks DavidW, мне удалось получить его для извлечения памяти, а затем, используя np.asarray (snap_array_view), я вижу, что это Snapshot_Counter long. К сожалению, если я попытаюсь распечатать любой из них, я получаю ошибку seg! Поэтому я подозреваю, что у меня нет проблемы. –

+0

@RDavies См. Редактирование. Я не хотел бы обещать, что это единственная проблема, но это, безусловно, проблема – DavidW

+0

отлично, что, похоже, исправило ее. Я новичок в указателях/адресах. Благодарю за ваше четкое объяснение. Он работает как с , так и перед именем массива. –