Передача памяти в функцию C

У меня есть функция C, объявленная следующим образом:

void getIndexOfState(long *p, long C, long G, long B, long *state);

В настоящее время мой код оболочки cython использует синтаксис буфера из массива numpy:

cpdef int getIndexOfState(self, np.ndarray[np.int_t, ndim=1, mode="c"] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, <long*> s.data)
    return out

Я хочу использовать новый синтаксис memoryview, мой вопрос в том, как я могу передать указатель на данные при использовании памяти?

Я пробовал:

cpdef int getIndexOfState(self, long[:] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, s)
    return out

который поднял ошибку "Can not assign type" long [:] 'to long], когда я пытался скомпилировать модуль. Есть какой-либо способ передать этот указатель, не возвращая память в массив numpy перед вызовом функции C?

Ответ 1

Если базовые данные правильно смежные /strided и в памяти есть хотя бы один элемент, тогда этого достаточно, чтобы пройти указатель на первый элемент (и, возможно, длину):

getIndexOfState(&out, self.C, self.G, self.B, &s[0])

EDIT:

Одним из способов обеспечения "правильного смежного" должно быть добавление "[:: 1]".

cpdef int getIndexOfState(self, long[::1] s):
    cdef long out
    getIndexOfState(&out, self.C, self.G, self.B, &s[0])
    return out