2012-08-14 7 views
6

mam coś takiego:Dostęp tablicę wskaźników w ramach struktury z Java z SWIG

typedef struct { 
    char * content; 
} Boo; 

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

chcę przekonwertować Boo ** data do tablicy z Boo elementów (Boo[]) w Javie z SWIG. A następnie odczytać tablicę (nie chcę edytować, usuwać i tworzyć nowej tablicy z kodu Java). W dokumentacji SWIG opisano, jak to zrobić z carrays.i i array_functions, ale element struktury użytkownika musi być typu Boo*. Czy istnieje rozwiązanie mojego problemu?

EDIT: Spieszyłem się i zapomniałem napisać, że chcę wygenerować klasy Java z SWIG do współpracy ze strukturami C.

+0

Dopóki nie dodasz długości do 'Foo', brzmi to zupełnie niemożliwe, ponieważ nie możesz magicznie wydedukować długości z samego wskaźnika. – unwind

+0

@unwind Przepraszam, zapomniałem dodać członka "size". Mam edytować moje pytanie. –

+0

Załóżmy, że masz więcej niż 3 elementy w strukturze danych. Jak uzyskać dostęp do trzeciego elementu? Załóżmy, że masz obiekt 'Foo x' z' x.size> = 3'. – pmg

Odpowiedz

3

Rozwiązanie jest bardzo proste. Wystarczy użyć w interfejsie swig:

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

A następnie uzyskać dostęp z Java z:

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

aby pobrać zawartość tablicy.

1

zawsze można zrobić malloc, przykład na karcie 1d byłoby:

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

Ale skoro zaczynasz malloc należy użyć wolny po odbywa się na karcie

W przeciwnym wypadku, zmień go na boo data [] lub data [] [] wymagałyby dokładnej liczby struct zaopatrzonej w kompilację przed kompilacją.

+0

Przykro mi. Nie napisałem tego pytania poprawnie. Czy możesz przeczytać to jeszcze raz? –