2012-08-14 8 views
6

Ho qualcosa di simile:Accesso a un array di puntatori all'interno di una struttura da Java con SWIG

typedef struct { 
    char * content; 
} Boo; 

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

voglio convertire Boo ** data ad un array con Boo elementi (Boo[]) in Java con SWIG. E poi leggere l'array (non voglio editare, eliminare e creare un nuovo array dal codice Java). Nella documentazione SWIG viene descritto come eseguire questa operazione con carrays.i e array_functions, ma il membro della struttura data deve essere di tipo Boo*. C'è una soluzione del mio problema?

MODIFICA: Mi sono affrettato e ho dimenticato di scrivere che voglio generare classi Java con SWIG per collaborare con le strutture C.

+0

A meno che non si aggiunga una lunghezza a 'Foo', sembra totalmente impossibile poiché non si può dedurre magicamente la lunghezza dal puntatore da solo. – unwind

+0

@unwind Mi dispiace, ho dimenticato di aggiungere il membro 'size'. Ho modificato la mia domanda. –

+0

Supponi di avere più di 3 elementi nella struttura dati. Come accederai al 3 ° elemento? Supponiamo di avere un oggetto 'Foo x' con' x.size> = 3'. – pmg

risposta

3

La soluzione è molto semplice. Basta usare in un'interfaccia sorso:

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

E poi accedere da Java con:

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

per recuperare il contenuto della matrice.

1

si può sempre fare una malloc, ad esempio per la scheda 1d sarebbe:

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

Ma dal momento che si avvia malloc è necessario utilizzare gratuitamente dopo aver finito con la scheda

In caso contrario, modificarlo a fischiare data [] o data [] [] richiederebbero un numero preciso di struct immagazzinato prima della compilazione.

+0

Mi dispiace. Non ho scritto la domanda giusta. Puoi leggerlo di nuovo? –

Problemi correlati