2011-11-07 8 views
6

मैं पायथन (2.6.5) के लिए एक्सटेंशन बनाने के लिए साइथन (0.15.2) का उपयोग कर रहा हूं। मैंने एक पीएक्सडी फाइल और एक पीईएक्स फाइल बनाई है।मुफ्त फ़ंक्शन के लिए साइथन संकलन त्रुटि ('FooBar *' टाइप करने के लिए पायथन ऑब्जेक्ट तर्क को परिवर्तित नहीं कर सकता)

cimport capifuncs 

cdef class myArray: 
    cdef capifuncs.myArray *_my_array 
    def __cinit__(self, size): 
     self._my_array = capifuncs.array_new(size) 
     if (self._my_array is NULL): 
      raise MemoryError() 

    def __dealloc__(self): 
     if self._my_array is not NULL: 
      capifuncs.array_free(self._my_array) 

    def __bool__(self): 
     return not capifuncs.IsEmpty(self._my_array) 


    ############################## 
    #  Array methods  # 
    ############################## 

    cpdef getItem(self, unsigned int pos): 
     if capifuncs.IsEmpty(self._my_array): 
      raise IndexError("Array is empty") 
     #if(): 
     # raise IndexError("Array bounds exceeded") 

     return capifuncs.array_get_item(self._my_array, pos) 


    cpdef setItem(self, unsigned int pos, double val): 
     if capifuncs.IsEmpty(self._my_array): 
      raise IndexError("Array is empty") 
     #if(): 
     # raise IndexError("Array bounds exceeded") 

     capifuncs.array_set_item(self._my_array, pos, val) 




# Free functions 
cpdef long someCAPIFuncCall(capifuncs.FooBar *fb, capifuncs.myArray *arr, long start, long stop): 
    return capifuncs.doSomethingInteresting(fb, arr, start, stop) 

अगर मैं मुफ्त (अर्थात गैर-सदस्य) समारोह परिभाषा बयान टिप्पणी, कोड सही तरीके से संकलित और विस्तार का उत्पादन किया है: यहाँ मेरी सिक्कों के नमूने रखने का बक्स फ़ाइल की सामग्री है। हालांकि, अगर मैं यह uncomment और फ़ाइल को संकलित करने का प्रयास करें, मैं निम्न त्रुटि संदेश मिलता है:

cafuncs.pyx:64:23: Cannot convert Python object argument to type 'FooBar *'

इस का कारण क्या है, और मैं इसे कैसे ठीक करूं?

उत्तर

4

एक समारोह cpdef के रूप में परिभाषित दोनों अजगर और सी

तर्क सी डेटा प्रकार के रूप में घोषित कर रहे हैं, Cython स्वचालित रूप से वस्तुओं जब यह अजगर से कहा जाता है समारोह में पारित कर दिया परिवर्तित करने का प्रयास करेंगे से प्रतिदेय है। लेकिन ऐसे रूपांतरण केवल संख्यात्मक और स्ट्रिंग प्रकारों के लिए संभव हैं - अन्य सभी प्रकारों के परिणामस्वरूप संकलन-समय त्रुटि होगी।

क्या आप इस समारोह को पायथन में बेनकाब करने का मतलब रखते थे? यदि नहीं, तो इसे cdef से परिभाषित करें।

अन्यथा, आपको उन सी प्रकारों के लिए रैपर बनाने की आवश्यकता होगी जिन्हें आप पाइथन से पास करना चाहते हैं। इसे करने के तरीके के कुछ उदाहरणों के लिए Cython Tutorials देखें।

+0

हाँ, मैं पाइथन से सी फ़ंक्शन को कॉल करने में सक्षम होना चाहता हूं - एक्सटेंशन बनाने का कारण पाइथन से डेटा लाइब्रेरी में डेटा प्रकारों और कार्यों का उपयोग करने में सक्षम होना है - इसलिए, मुझे होने की आवश्यकता है पाइथन से सी फ़ंक्शन को कॉल करने में सक्षम है, और इसे सी डेटा प्रकार (पायथन से) –

+0

निष्पादित रूप से पास करें, अगर मैं cpdef के बजाय cdef का उपयोग करता हूं, तो कोड संकलित करता है, लेकिन मुझे निम्न चेतावनी संदेश मिलता है: चेतावनी: '__pyx_f_6clib_doSomethingInteresting' परिभाषित है लेकिन उपयोग नहीं किया। अनजाने में, जब मैं अजगर से फ़ंक्शन का उपयोग करने का प्रयास करता हूं, तो मुझे त्रुटि मिलती है विशेषताएँ: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है 'doSomethingInteresting' –

+0

@ होमुनकुलस रीटिकुली। मेरा अद्यतन उत्तर देखें। असल में, आपको अपने सी प्रकारों के लिए रैपर बनाने की आवश्यकता है। – ekhumoro

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

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