Могу ли я `fwrite` просмотреть память в Cython? - PullRequest
2 голосов
/ 11 июля 2019

Можно ли записать на диск массив с помощью функции ac fwrite?Из документации Cython Memory View я понимаю, что «они могут обрабатывать массивы C», но я не вижу явных примеров таких.

Вот что я пытаюсь:

cdef FILE *fptr
fptr = fopen("data.dat", "w")
cdef double[:] array = numpy.array([.5, 1.5, 2.5, -9, 0.0, 5])
fwrite(array, sizeof(double), array.size, fptr)

НоЯ получаю следующую ошибку компиляции:

Error compiling Cython file:
------------------------------------------------------------
...
def write_values(file_path):
    """Tracer code to write values to a C file."""
    cdef FILE *fptr
    fptr = fopen("data.dat", "w")
    cdef double[:] array = numpy.array([.5, 1.5, 2.5, -9, 0.0, 5])
    fwrite(array, sizeof(double), array.size, fptr)
          ^
------------------------------------------------------------

write_with_c.pyx:23:11: Cannot assign type 'double[:]' to 'const void *'

Возможно ли это сделать?

1 Ответ

3 голосов
/ 11 июля 2019

Согласно документам , вы должны передавать адрес первого элемента (double* должен быть конвертируемым в const void* без приведения), и для принудительной корректности вы может потребоваться явно объявить представление памяти с помощью cdef double[::1] array, что обеспечивает представление непрерывной памяти C, производя последние строки:

cdef double[::1] array = numpy.array([.5, 1.5, 2.5, -9, 0.0, 5])
fwrite(&array[0], sizeof(double), array.size, fptr)
...