6

私はこのようなものを持っています:

typedef struct {
    char * content;
} Boo;

typedef struct {
    Boo **data;
    int size;
} Foo;

SWIGでJavaの要素( )Boo ** dataを持つ配列に変換したい。次に、配列を読み取ります(Javaコードから新しい配列を編集、削除、作成したくありません)。SWIG のドキュメントでは、 andを使用してこれを行う方法が説明されていますが、構造体のメンバーは型でなければなりません。私の問題の解決策はありますか?BooBoo[]carrays.iarray_functionsdataBoo*

編集: C 構造と連携するために SWIG を使用して Java クラスを生成したいことを書き忘れていました。

4

2 に答える 2

3

解決策はとても簡単です。swigインターフェースで使用するだけです:

%include <carrays.i>
%array_functions(Boo *, boo_array);

そして、Javaからアクセスするには:

SWIGTYPE_p_p_Boo results = foo.getData();
for(int i = 0; i < foo.getSize(); i++) {
    Boo booResult = foo.boo_array_getitem(results, i);
}

配列のコンテンツを取得します。

于 2012-08-14T14:32:42.563 に答える
1

いつでもmallocを実行できます.1dタブの例は次のようになります:

int main (void)                                                          
 {                                                                
    int   size;                                                        
    Foo a;

  size = 2;
  if (!(a.data = malloc(size * sizeof(*(a.data)))))
   return (-1);
    // so you will have a.data[0] or a.data[1] ...

    //   for malloc on 2d                                   
    //   if (!(a.data[0] = malloc(size * sizeof(*(a.data)))))                
    //    return (-1);                                                     
  return 0;
 }

ただし、malloc を開始するため、タブを使用した後は free を使用する必要があります

それ以外の場合は、boo data[] または data[][] に変更すると、コンパイルする前に正確な数の構造体が必要になります。

于 2012-08-14T12:55:13.913 に答える