Estoy tratando de llamar al qsort
en Cython con una función de comparación personalizada, pero no entiendo cómo pasar la referencia de la función. En primer lugar, tengo una estructura:¿Cómo paso un puntero a una función c en Cython?
cdef struct Pair:
int i,j
float h
La comparar tipo de función por h
:
cdef int compare(const_void *a, const_void *b):
cdef float v = ((<Pair*>a)).h-((<Pair*>b)).h
if v < 0: return -1
if v > 0: return 1
return 0
Esta es la parte que estoy teniendo problemas con:
cdef Pair[5] pa
for i in range(5):
pa[i].i = i;
pa[i].j = i*2;
pa[i].h = i*.5;
qsort(pa,5,sizeof(Pair),compare)
La última línea ganó No compilo y genero este error que creo que está relacionado con el hecho de que no puedo entender cómo pasar compare
como referencia al qsort
:
Cannot assign type 'int (const_void *, const_void *)' to 'int (*)(const_void *, const_void *) nogil'
Tengo un [post Cython] (http://stackoverflow.com/questions/41944883/verifying-compatibility-in-compiling-extension-types-and-using-them-with-cdef) es posible que pueda proporcionar información sobre. – Phillip