2017-02-12 29 views
1

我在結構中使用了一個靈活的數組。所以我想用我自己的一些代碼來改變分配給這個結構的內存。基本上我想改變new_structname()和structname_variable_set()函數。如何更改由SWIG生成的用於C結構內存分配的默認代碼?

typedef struct vector{ 
    int x; 
    char y; 
    int arr[0]; 
} vector; 

這裏,SWIG產生new_vector()函數通過調用calloc(1,sizeof(struct vector))其中痛飲不會以特殊方式處理這些類型的結構分配內存。所以我們需要修改swig生成的new_vector()以便爲靈活數組分配內存。那麼有什麼辦法可以解決這個問題嗎?

+0

你能更具體地說明你需要如何改變它們嗎?切換到具有等同語義的替代命名函數相當容易,但如果您想要執行更復雜的操作,則需要進行更深入的更改。 – Flexo

+0

在new_structname()函數中,內存分配如下。 var = calloc(1,sizeof(struct name))。這將考慮結構離開柔性陣列的大小。所以我想要做的是var = calloc(1,sizeof(struct name)+ size_of_flexi_arr); size_of_flexi_arr將由用戶提供。 –

+0

我不想改變函數的名字,我想改變函數裏面的代碼。 –

回答

0

有幾種方法可以做到這一點。你要找的是%extend。這讓我們可以定義新的構造函數並在我們認爲合適的時候實現它們。 (它甚至可以和C編譯器一起工作,它們只是目標語言角度的構造函數)。

使用您的vector爲出發點,我們就可以說明這一點:

%module test 

%include <stdint.i> 

%inline %{ 
typedef struct vector{ int x; char y; int arr[0]; }vector; 
%} 

%extend vector { 
    vector(const size_t len) { 
     vector *v = calloc(1, sizeof *v + len); 
     v->x = len; 
     return v; 
    } 
} 

有了這個痛飲在生成的模塊代碼synthesises一個new_vector功能你會期望。

我還假定你想記錄結構內的長度作爲其成員之一。如果情況並非如此,您可以簡單地刪除我所做的任務。

+0

謝謝。這有很大幫助。 –