समस्या: मैंने SWIG का उपयोग करके अजगर में कुछ सी ++ कोड लपेट लिया है। अजगर की तरफ, मैं एक लपेटा हुआ सी ++ पॉइंटर लेना चाहता हूं और इसे उप-वर्ग में पॉइंटर होने के लिए नीचे डालना चाहता हूं। मैंने SWIG .i फ़ाइल में एक नया सी ++ फ़ंक्शन जोड़ा है जो यह डाउन-कास्टिंग करता है, लेकिन जब मैं इसे पायथन से कॉल करता हूं, तो मुझे टाइप एरर मिलता है।मैं एक पाइथन SWIG wrapper से C++ ऑब्जेक्ट को डाउन-कैस्ट कैसे करूं?
मैं दो C++ कक्षाएं, बेस और व्युत्पन्न है:
यहाँ विवरण हैं। व्युत्पन्न बेस का उप-वर्ग है। मेरे पास एक तीसरी कक्षा है, कंटेनर, जिसमें एक व्युत्पन्न है, और इसमें एक एक्सेसर प्रदान करता है। एक्सेसर, दिखाया गया है एक स्थिरांक बेस & के रूप में व्युत्पन्न रिटर्न:
class Container {
public:
const Base& GetBase() const {
return derived_;
}
private:
Derived derived_;
};
मैं बड़ा घूँट का उपयोग कर अजगर में इन कक्षाओं में लिपटे गए हैं। मेरे पायथन कोड में, मैं आधार संदर्भ को नीचे व्युत्पन्न करने के लिए नीचे कास्ट करना चाहता हूं। ऐसा करने के लिए, मैं बड़ा घूँट में लिखा है C++ जो नीचे कास्टिंग करता है में एक सहायक समारोह फाइल मैं:
base = container.GetBase()
derived = CastToDerived(base)
:
%inline %{
Derived* CastToDerived(Base* base) {
return static_cast<Derived*>(base);
}
%}
मेरी अजगर कोड में, मैं यह नीचे कास्टिंग फ़ंक्शन को कॉल करें
जब मैं ऐसा है, तो मैं निम्नलिखित त्रुटि मिलती है:
TypeError: in method 'CastToDerived', argument 1 of type 'Base *'
ऐसा क्यों हो रहा हो सकता है?
संदर्भ के लिए, यहां SWIG द्वारा जेनरेट की गई .cxx फ़ाइल के प्रासंगिक बिट्स हैं; अर्थात् मूल कार्य है, और उसके अजगर इंटरफ़ेस-वर्गीकृत कार्बन कॉपी:
Derived* CastToDerived(Base* base) {
return static_cast<Derived*>(base);
}
// (lots of other generated code omitted)
SWIGINTERN PyObject *_wrap_CastToDerived(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
Base *arg1 = (Base *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;
Derived *result = 0 ;
if (!PyArg_ParseTuple(args,(char *)"O:CastToDerived",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Base, 0 | 0);
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CastToDerived" "', argument " "1"" of type '" "Base *""'");
}
arg1 = reinterpret_cast< Base * >(argp1);
result = (Derived *)CastToDerived(arg1);
resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Derived, 0 | 0);
return resultobj;
fail:
return NULL;
}
किसी भी मदद की बहुत सराहना की जाएगी।
- मैट
क्या GetBase लिए बनाए गए कोड() कैसा दिखता है? त्रुटि का अर्थ है कि ऑस्ट ऑब्जेक्ट कोस्टोडेडिव में पास किया जा रहा है सही प्रकार नहीं है - यह किस प्रकार का है? –
इसके लायक होने के लिए, मैंने स्विंग 1.3.40 का उपयोग करके उपरोक्त के आधार पर एक उदाहरण बनाने की कोशिश की, और मुझे यह त्रुटि नहीं मिली। –
बहुत अजीब ... मैंने आपके उदाहरण, क्रिस की तरह कुछ लिखने की कोशिश की, और वास्तव में यह काम किया। जैसा कि आप उम्मीद कर सकते हैं, जिस कोड में मुझे वास्तव में परेशानी हो रही है वह खिलौना की समस्या नहीं है, मैं सिर्फ खिलौना-अगर इसे किसी प्रश्न में फिट करने के लिए पर्याप्त छोटा बनाता हूं। मेरा वर्तमान वर्कअराउंड मेरी C++ लाइब्रेरी में CastToDerived फ़ंक्शन को परिभाषित करना है, बजाय% inline% {...%} .i फ़ाइल में ब्लॉक करें। यह समस्या को हल करता है। शायद वह विवरण सही व्यक्ति के लिए संकेत हो सकता है? मुझे अभी भी इच्छा है कि मैं अपने सी ++ लाइब्रेरी में एसडब्ल्यूआईजी हेल्पर्स जोड़ने के बिना कर सकता हूं। – SuperElectric