2017-02-12 4 views
1

私は構造体にフレキシブルな配列を使用しています。だから私は自分のコードのいくつかでその構造体に割り当てられたメモリを変更したい。基本的には、new_structname()とstructname_variable_set()関数を変更したいと思います。ここ C構造のメモリの割り当てのためにSWIGによって生成されるデフォルトのコードを変更するにはどうすればいいですか?

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

は、SWIGはSWIGは特殊な方法で構造のこれらのタイプを処理しません calloc(1,sizeof(struct vector))を呼び出してメモリを割り当てる new_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出発点として、我々はこれを説明することができます:あなたが望んだだろうと、このSWIGで

%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; 
    } 
} 

は、生成されたモジュールのコードでnew_vector機能を合成します。

また、構造体内の長さをメンバの1つとして記録すると仮定しました。そうでない場合は、私が行った課題を単に削除することができます。

+0

ありがとうございます。それはたくさんの助けになりました。 –

関連する問題