2012-08-14 71 views
6

我有這樣的事情:訪問從Java結構內的指針數組與痛飲

typedef struct { 
    char * content; 
} Boo; 

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

我想Boo ** data轉換爲與Boo元素(Boo[])在Java中使用SWIG的數組。然後讀取數組(我不想編輯,刪除並從Java代碼創建一個新的數組)。在SWIG文檔中描述瞭如何使用carrays.iarray_functions來完成此操作,但結構的成員data必須是Boo*。有沒有解決我的問題?

編輯: 我匆匆忙忙,我忘了寫我想用SWIG生成Java類來與C結構合作。

+0

除非你給'Foo'增加一個長度,否則這聽起來完全不可能,因爲你不能單獨從指針中神奇地推導出長度。 – unwind 2012-08-14 12:36:30

+0

@unwind對不起,我忘了添加'size'成員。我編輯了我的問題。 – 2012-08-14 12:39:30

+0

假設您的數據結構中有3個以上的元素。你將如何訪問第三個元素?假設你有一個對象'Foo x',其中'x.size> = 3'。 – pmg 2012-08-14 12:45:56

回答

3

該解決方案非常簡單。就在痛飲接口使用:

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

檢索陣列的內容。

1

你總是可以做一個malloc,例如一維選項卡將是:

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你的標籤做

否則以後就必須使用自由,將其更改爲噓在編譯之前,data []或data [] []將需要精確數量的結構庫存。

+0

方法對不起。我沒有寫下正確的問題。你能再讀一遍嗎? – 2012-08-14 13:03:40