मुझे SWIG (संस्करण 3.0.6) का उपयोग कर एक सी ++ लाइब्रेरी के चारों ओर एक पायथन रैपर उत्पन्न करने में कुछ परेशानी हो रही है।पायथन में कक्षा प्रकारों के लिए SWIG OUTPUT टाइपमैप कैसे लागू करें?
मेरा मुद्दा OUTPUT टाइपमैप को लागू करने से संबंधित है, खासकर कक्षा प्रकारों के पॉइंटर्स/संदर्भों के मामले में।
समझने के लिए, यह है कि मैं क्या मानक प्रकार के लिए चाहते हैं, और यह काम करता है:
// .h
int add(const long arg1,const long arg2,long& resultLong);
// interface.i
%apply long& OUTPUT { long& resultLong };
int add(const long arg1,const long arg2,long& resultLong);
// projectWrapper.py
def add(arg1, arg2):
return _projectWrapper.add(arg1, arg2)
addTerm = _projectWrapper.add
// usage
>>> result = projectWrapper.add(2, 4)
>>> print result
[0, 6L]
आप "resultLong" में पारित करने के लिए की जरूरत नहीं है, लेकिन यह परिणाम के लिए स्वचालित रूप से जोड़ दिया जाता है। महान!
बहरहाल, यह काम करने के रूप में मैं उम्मीद जब उत्पादन प्रकार एक वर्ग प्रकार के लिए कुछ सूचक है प्रतीत नहीं होता:
// .h
int GetClassType(const char* name, exportedClassType*& resultPointer);
class exportedClassType
{...}
// interface.i
%apply exportedClassType*& OUTPUT { exportedClassType*& resultPointer };
int GetClassType(const char* name, exportedClassType*& resultPointer);
// projectWrapper.py
def GetClassType(name, resultPointer):
return _projectWrapper.GetClassType(name, resultPointer)
GetClassType = _projectWrapper.GetClassType
समस्या हो कि बड़ा घूँट ही में उसे पूरा नहीं किया लगता है सरल प्रकार के रूप में रास्ता। यह अभी भी लपेटा गया फ़ंक्शन हस्ताक्षर में "इनपुट" पैरामीटर के रूप में दिखाई देता है।
// attempted usage
>>> classType = projectWrapper.GetClassType("name")
TypeError: GetClassType() takes exactly 2 arguments (1 given)
>>> result = 0
>>> projectWrapper.GetClassType("name", result)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: in method 'GetClassType', argument 2 of type 'exportedClassType *&'
क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं या मुझे सही दिशा में इंगित करता हूं? किसी भी मदद से कृतज्ञता से प्राप्त! धन्यवाद
में आप एक डबल सूचक उपयोग करने की कोशिश की है? मुझे डबल पॉइंटर्स और एसडब्ल्यूआईजी 2.0.7 का उपयोग करके उत्पन्न कोड के साथ समस्याएं थीं, लेकिन यह 3.X.X –
में हल हो गई है। क्षमा करें, यह इंटरफ़ेस.आई फ़ाइल में कैसा दिखता है? – SWilliams
मुझे यह उल्लेख करना चाहिए कि मेरे पास C++ का स्वामित्व नहीं है और वहां विधि हस्ताक्षर नहीं बदल सकते हैं। मुझे निश्चित रूप से 'exportedClassType * और' पैरामीटर लेने वाली विधि को संभालने की आवश्यकता है। – SWilliams