2012-11-14 28 views
6

Tôi gói một thư viện C có chứa một cấu trúc:SWIG Python - gói một chức năng mà hy vọng một con trỏ đúp vào một struct

struct SCIP 
{ 
//... 
} 

và một chức năng mà tạo ra một cấu trúc như:

void SCIPcreate(SCIP** s) 

SWIG tạo ra một lớp python SCIP và một hàm SCIPcreate(*args) từ đó.

Khi tôi thử gọi SCIPcreate() trong python, nó rõ ràng là mong đợi một tham số kiểu SCIP**, làm cách nào tôi tạo ra một thứ như vậy?

Hoặc tôi có nên thử và mở rộng lớp SCIP với hàm tạo tự động gọi số SCIPcreate() không? Nếu vậy, làm thế nào tôi sẽ đi về điều đó?

Trả lời

5

Với các tập tin tiêu đề:

struct SCIP {}; 

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

Chúng ta có thể quấn chức năng này sử dụng:

%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" 

đó là hai typemaps, một để tạo ra một địa phương, con trỏ tạm thời được sử dụng làm đầu vào cho chức năng và một chức năng khác để sao chép giá trị của con trỏ sau khi cuộc gọi vào trả về.

Là một thay thế vào đó bạn cũng có thể sử dụng %inline để thiết lập một tình trạng quá tải:

%newobject SCIPcreate; 
%inline %{ 
    struct SCIP *SCIPcreate() { 
    struct SICP *temp; 
    SCIPcreate(&temp); 
    return temp; 
    } 
%} 
Các vấn đề liên quan