2013-03-03 11 views
8

मेरे पास एक सी ++ फ़ंक्शन है जिसमें दो तर्क निम्न उदाहरण के रूप में दिए गए हैं।पायथन + SWIG में संदर्भ और सूचक तर्क कैसे प्राप्त करें?

void func(int& n, char** data) 
{ 
    *data = other_func1(); // returns a char array 
    n = other_func2(); // returns the length of the array 
} 

मैं आसानी से सी या सी ++ में इस सुविधा का उपयोग कर सकते हैं, लेकिन मैं नहीं जानता कि मैं इसे कैसे बड़ा घूँट से बनाए गए पायथन मॉड्यूल से कॉल कर सकते हैं। मुझे लगता है कि मुझे एक और सी ++ फ़ंक्शन लिखना होगा जो कि लौटाता है, उदाहरण के लिए, std :: pair। लेकिन यदि संभव हो, तो मैं पाइथन पक्ष में एक कामकाज जानना चाहता हूं। क्या कोई मदद कर सकता है?

%apply int *OUTPUT { int *n }; 

जो कुछ डिफ़ॉल्ट typemaps कि बड़ा घूँट उत्पादन मानकों के लिए प्रदान करता उपयोग करता है:

उत्तर

8
काफी मामलों (जैसे int *n) का एक बहुत यह लिखने के लिए पर्याप्त होगा के लिए

। (इसमें भी शामिल है और इनपुट जो समान हैं)।

इस उदाहरण में हालांकि हम किसी पूर्वनिर्धारित मामलों से मेल नहीं खाते हैं, इसलिए हमें मैन्युअल रूप से वही काम करने की आवश्यकता है। यह मूल रूप से दो टाइपमैप्स प्रति तर्क है - एक इनपुट टाइपमैप जो वास्तविक फ़ंक्शन कॉल के लिए कुछ अस्थायी बनाता है और कुछ वास्तविक इनपुट और एक बहस के बजाय उपयोग करता है जो परिणामों को अस्थायी से पायथन तक वापस कर देता है। पायथन के मामले में कई तर्कों को वापस करने के लिए एक ट्यूपल का उपयोग करना समझ में आता है।

एक उदाहरण:

%module test 

%typemap(in,numinputs=0) int& n (int temp) "$1 = &temp;" 
%typemap(in,numinputs=0) char **data (char *temp) "$1 = &temp;" 

%typemap(argout) char **data { 
    %append_output(PyString_FromString(*$1)); 
} 

%typemap(argout) int& n { 
    %append_output(PyInt_FromLong(*$1)); 
} 

%inline %{ 
    void foo(int& n, char **data) { 
    static char str[] = "Hello world"; 
    *data = str; 
    n = sizeof str; 
    } 
%} 

अंक नोट करने के लिए:

अस्थायी चर (int temp, char *temp) स्वचालित रूप से नाम दिया गया हो जो स्पष्ट नाम टकराव बंद हो जाता है। %append_output एक एसडब्ल्यूआईजी मैक्रो है जो पाइथन में $result टुपल के पीछे कुछ जोड़ने के लिए विस्तार करता है। यदि आपका फ़ंक्शन foo गतिशील रूप से आवंटित स्मृति था, तो आपको इसे संभालने की आवश्यकता होगी। फ़्रीयरग टाइपमैप अक्सर उपयोगी होता है यदि टाइपमैप में गतिशील रूप से स्मृति आवंटित करने की आवश्यकता होती है।

import test 

len,str = test.foo() 

print len 
print str 
:

यह मैं संकलित करने के लिए अनुमति देते हैं और इसे पसंद चलाने के लिए पर्याप्त था

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