2011-12-02 15 views
13

मैं कस्टम तुलना फ़ंक्शन के साथ साइथन में qsort पर कॉल करने का प्रयास कर रहा हूं लेकिन मुझे समझ में नहीं आता कि फ़ंक्शन संदर्भ को कैसे पास किया जाए।मैं साइथन में सी फ़ंक्शन में पॉइंटर कैसे पास करूं?

cdef struct Pair: 
    int i,j 
    float h 

h द्वारा समारोह प्रकार की तुलना:

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) 

अंतिम पंक्ति जीता:

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 

इस भाग मैं कुछ समस्या आ रही है पहले, मैं एक struct है इस त्रुटि को संकलित और उत्पन्न नहीं करता है जो मुझे विश्वास है कि इस तथ्य से संबंधित है कि मैं compare को qsort के संदर्भ के रूप में कैसे पास कर सकता हूं:

Cannot assign type 'int (const_void *, const_void *)' to 'int (*)(const_void *, const_void *) nogil' 

उत्तर

9

मैं आपकी त्रुटि को पुन: उत्पन्न करने में सक्षम नहीं हूं। आप जिस कोड का उपयोग कर रहे हैं वह सही है, और साइथन 0.15 के साथ काम कर रहा है। एकमात्र चीज जो मैं देखता हूं वह आपकी त्रुटि हो सकती है वह "गिल" प्रकार में संलग्न है। यदि आप विशेष रूप से आयातित विधि को "गिल सेफ" के रूप में घोषित करना चाहते हैं, तो घोषणा के अंत में "नोगिल" संलग्न करें।

(ध्यान दें कि आप cython -एक, तो के लिए खुला वेब ब्राउज़र के साथ अपने अजगर कोड की जांच कर सकते)

 
cdef extern from "stdlib.h": 
    ctypedef void const_void "const void" 
    void qsort(void *base, int nmemb, int size, 
      int(*compar)(const_void *, const_void *)) nogil 

cdef struct Pair: 
    int i,j 
    float h 

cdef int compare(const_void *a, const_void *b): 
    cdef float v = ((a)).h-((b)).h 
    print 'do something with', v 
    if v 0: return 1 
    return 0 

def r(): 
    cdef Pair[5] pa 
    for i in range(5): 
     pa[i].i = i; 
     pa[i].j = i*2; 
     pa[i].h = i*.5; 
    print 'call qsort' 
    qsort(pa,5,sizeof(Pair),compare) 
    print 'call qsort done' 

r() 

इस स्निपेट के रूप में संकलित किया गया है:

 
$ cython --version 
Cython version 0.15 
$ cython --embed test.pyx 
$ gcc -I/usr/include/python2.7 -Wall -std=c99 test.c -lpython2.7 
$ ./a.out 
call qsort 
do something with -0.5 
do something with -0.5 
do something with -0.5 
do something with -1.0 
do something with -0.5 
call qsort done 
+0

मैं एक [Cython पोस्ट] है (http://stackoverflow.com/questions/41944883/verifying-compatibility-in-compiling-extension-types-and-using-them-with-cdef) आप अंतर्दृष्टि प्रदान करने में सक्षम हो सकते हैं। – Phillip

संबंधित मुद्दे