2012-11-14 29 views
6

मुझे लगता है कि एक struct शामिल एक सी पुस्तकालय लपेटकर कर रहा हूँ उम्मीद लपेटकर:बड़ा घूँट अजगर - एक समारोह है कि एक struct करने के लिए एक डबल सूचक

struct SCIP 
{ 
//... 
} 

और एक समारोह है कि इस तरह के एक struct बनाता है:

void SCIPcreate(SCIP** s) 

एसडब्ल्यूआईजी एक पायथन वर्ग SCIP उत्पन्न करता है और उस से एक समारोह SCIPcreate(*args) उत्पन्न करता है।

जब मैं अब पाइथन में SCIPcreate() पर कॉल करने का प्रयास करता हूं, तो यह स्पष्ट रूप से SCIP** के पैरामीटर की अपेक्षा करता है, मुझे ऐसी चीज़ कैसे बनाना है?

या मुझे SCIP कक्षा को एक ऐसे निर्माता के साथ चलाने और विस्तारित करना चाहिए जो स्वचालित रूप से SCIPcreate() पर कॉल करता है? यदि हां, तो मैं इसके बारे में कैसे जाऊं?

उत्तर

5

हेडर फाइल को देखते हुए:

struct SCIP {}; 

void SCIPcreate(struct SCIP **s) { 
    *s = malloc(sizeof **s); 
} 

हम उपयोग करते हुए इस समारोह में लपेट कर सकते हैं:

%module test 
%{ 
#include "test.h" 
%} 

%typemap(in,numinputs=0) struct SCIP **s (struct SCIP *temp) { 
    $1 = &temp; 
} 

%typemap(argout) struct SCIP **s { 
    %set_output(SWIG_NewPointerObj(SWIG_as_voidptr(*$1), $*1_descriptor, SWIG_POINTER_OWN)); 
} 

%include "test.h" 

जो दो typemaps है, एक एक स्थानीय, अस्थायी सूचक बनाने के लिए करने के लिए इनपुट के रूप में प्रयोग की जाने वाली रिटर्न में कॉल के बाद पॉइंटर के मूल्य की प्रतिलिपि बनाने के लिए फ़ंक्शन और दूसरा।

इस के लिए एक विकल्प आप भी %inline इस्तेमाल कर सकते हैं एक अधिभार स्थापित करने के लिए के रूप में:

%newobject SCIPcreate; 
%inline %{ 
    struct SCIP *SCIPcreate() { 
    struct SICP *temp; 
    SCIPcreate(&temp); 
    return temp; 
    } 
%}