2010-11-23 15 views
8

के साथ SWIG सी ++ बाइंडिंग मैं कुछ सी ++ कोड के लिए कुछ SWIG/पायथन बाइंडिंग लिख रहा हूं। यह किनेक्ट दुर्घटनाग्रस्त एपीआई कहलाता है, मेरे पास मोटर है और working का नेतृत्व किया गया है। श्रोता वर्ग को कॉलबैक जो आरजीबी और गहराई बफर को पार्स और पॉप्युलेट करते हैं, उन्हें एसडब्ल्यूआईजी से नहीं कहा जाता है। डेटा कैप्चर थ्रेड स्पष्ट रूप से शुरू होते हैं और सीपीयू को हॉगिंग शुरू करते हैं, लेकिन कॉलबैक से कोई डीबग लाइन नहीं आती है। डेटा बफर को पॉप्युलेट करने और आसानी से उन्हें पायथन से एक्सेस करने का बेहतर तरीका क्या होगा?कॉलबैक

class KinectListener 
{ 
    public: 
     virtual ~KinectListener(){}; 
     virtual void KinectDisconnected(Kinect *K) {}; 
     virtual void DepthReceived(Kinect *K) {}; 
     virtual void ColorReceived(Kinect *K) {}; 
     virtual void AudioReceived(Kinect *K) {}; 
}; 

यहाँ आभासी तरीकों के साथ श्रोता वर्ग, पायथन इस वर्ग के संस्करण C++ वर्ग के लिए श्रोताओं के वारिस के लिए किया जा लपेटा जा सकता है? मैंने सी ++ में एक न्यूनतम श्रोता जोड़ा और अब शेष कार्य टाइपमैप्स के साथ कुशलता से सरणी तक पहुंचने के लिए है। वर्तमान में मैं इस बेवकूफ टाइपमैप का उपयोग कर रहा हूं

%typemap(out) unsigned short [ANY] { 
    int i; 
    $result = PyList_New($1_dim0); 
    for (i = 0; i < $1_dim0; i++) { 
    PyObject *o = PyInt_FromLong((long)$1[i]); 
    PyList_SetItem($result,i,o); 
    } 
} 

बेहतर विकल्प?

उत्तर

3

निदेशकों की सुविधा का उपयोग करने का एक तरीका है। अपने KinectListener प्रॉक्सी के लिए इसे सक्षम करें, कोड की एक पंक्ति:

%feature("director") KinectListener 

तो फिर तुम अजगर कोड में KinectListener वर्ग से विरासत और अपने कार्यों को परिभाषित कर सकते हैं।

+0

मेरे पास एक ही प्रश्न था - N0vember की प्रतिक्रिया इसका उत्तर देती है। किसी फ़ंक्शन को कॉल करने के लिए पॉइंटर प्राप्त करने के बजाय, एक पॉलीमोर्फिक क्लास को पॉइंटर प्राप्त करें जहां आप उस फ़ंक्शन का नाम जानते हैं जिसे आप कॉल करने की योजना बना रहे हैं। – Jonathan

2

संयोग से, मैं फिलहाल एसडब्ल्यूआईजी के साथ कॉलबैक देख रहा हूं।

SWIG 2.0 documentation says this:

बड़ा घूँट समारोह संकेत के लिए पूर्ण समर्थन प्रदान की है कि कॉलबैक कार्यों सी में और लक्ष्य भाषा में नहीं परिभाषित कर रहे हैं प्रदान करता है। ... हालांकि, मौजूदा सी कार्यों का उपयोग तर्क के रूप में किया जा सकता है बशर्ते आप उन्हें स्थिरांक के रूप में स्थापित करें। ऐसा करने का एक तरीका इस तरह के% निरंतर निर्देश का उपयोग करना है ...

मैं जावा में कॉल करने के लिए हाथ से लिखित जेएनआई के साथ एक सी कॉलबैक लिखने की योजना बना रहा हूं। अगर कोई और तरीका है, तो मुझे यह सुनना भी अच्छा लगेगा।