2017-02-12 43 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

谢谢。这有很大帮助。 –