2013-02-20 75 views
1

Swig的手冊有點讓我困惑。我將我的C庫封裝到python中,以便我可以在python中測試我的C代碼。現在我想知道我怎麼能訪問在Python, 例如C指針,指向的地址,這是我的代碼有SWIG如何將緩衝區(char數組)和從C指向Python的指針?

typedef struct _buffer_t { 
char buf[1024]; 
char *next_ptr; 
} buffer_t; 



void parse_buffer(buffer_t * buf_p) { 
    buf_p -> next_ptr ++; 
} 

我想要做的是下面,在C代碼

buffer_t my_buf; 
my_buf.next_ptr = my_buf.buf; 
parse_buffer(&my_buf); 
expect_equal(&(my_buf.buf)+1, my_buf.next_ptr); 

如何在Python中做同樣的事情? 導入SWIG包裝模塊後,我有python中的buffer_t類。

回答

1

問題是SWIG試圖在Python中將緩衝區作爲一個字符串來包裝,這不僅僅是一個指針。 next_ptr的合成分配將分配內存並進行字符串複製,而不僅僅是進行指針分配。你可以用幾種方法解決這個問題。

最簡單的就是用%extend在Python添加一個「復位緩衝區」方法:

%extend { 
    void resetPtr() { 
    $self->next_ptr=$self->buf; 
    } 
} 

然後可以在Python中調用,以你想要的分配。

或者,如果您想強制將緩衝區視爲另一個指針,則可以強制SWIG將兩個成員都視爲void*而不是char*char[]。我曾希望這將是爲%apply每種類型一樣簡單,但似乎不正確的在我的測試memberin和memberout工作:

%apply void * { char *next }; 
%apply void * { char buf[ANY] }; 

鑑於memberin/memberout typemaps是至關重要的,以使這項工作我認爲%extend是迄今爲止最乾淨的解決方案。

+0

感謝您指出%extend選項。它的工作原理,我也用它來獲取指針地址。 – wei 2013-03-07 02:29:56

+0

後續問題,我有一個像void my_func(void * ptr)的函數;我怎樣才能將我的buf_p-> next_ptr傳遞給它?我已經使用%apply void * {char * next_ptr}來替換類型。謝謝! – wei 2013-03-07 13:36:08

相關問題