2017-02-12 18 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 обрабатывать эти типа структуры особым образом. Поэтому нам нужно изменить созданный swig new_vector(), чтобы выделить память для гибкого массива. Так есть ли способ справиться с этим?

+0

Можете ли вы уточнить, как вам нужно их менять? Переключение на альтернативную именованную функцию с эквивалентной семантикой довольно просто, но если вы хотите сделать более сложные вещи, вам нужно будет сделать более глубокие изменения. – Flexo

+0

В памяти функции new_structname() выделено ниже. var = calloc (1, sizeof (имя структуры)). это рассмотрит размер структуры, выходящей из гибкого массива. Итак, что я хочу сделать, это 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; 
    } 
} 

С этой SWIG синтезирует new_vector функции в сгенерированном коде модуля, как вы надеялись.

Я также предположил, что вы хотите записать длину внутри структуры как один из ее членов. Если это не так, вы можете просто удалить задание, которое я сделал.

+0

Спасибо. Это очень помогло. –