2012-08-14 11 views
6

Tengo algo como esto:Acceso a una matriz de punteros dentro de una estructura de Java con el TRAGO

typedef struct { 
    char * content; 
} Boo; 

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

Quiero cambiar Boo ** data a una matriz con elementos (BooBoo[]) en Java con el TRAGO. Y luego, para leer la matriz (no quiero editar, eliminar y crear una nueva matriz a partir del código de Java). En la documentación de SWIG se describe cómo hacerlo con carrays.i y array_functions, pero el miembro de la estructura data debe ser del tipo Boo*. ¿Hay alguna solución a mi problema?

EDIT: Me apresuré y olvidé escribir que quiero generar clases de Java con SWIG para cooperar con las estructuras de C.

+0

A menos que agregue una longitud a 'Foo', parece totalmente imposible ya que no puede deducir mágicamente la longitud del puntero solo. – unwind

+0

@unwind Lo siento, olvidé agregar el miembro 'size'. He editado mi pregunta –

+0

Supongamos que tiene más de 3 elementos en su estructura de datos. ¿Cómo accedería al tercer elemento? Supongamos que tiene un objeto 'Foo x' con' x.size> = 3'. – pmg

Respuesta

3

La solución es muy fácil. Sólo tiene que utilizar en una interfaz trago:

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

Y luego acceder desde 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); 
} 

para recuperar el contenido de la matriz.

1

siempre se puede hacer un malloc, ejemplo para pestaña 1d sería:

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

Pero desde que inicie malloc debe utilizar libre después de que haya terminado con la pestaña

De lo contrario, cambiarlo a abuchear data [] o data [] [] requerirían un número preciso de estructuras almacenadas antes de compilar.

+0

Lo siento. No escribí la pregunta correctamente. ¿Puedes leerlo de nuevo? –

Cuestiones relacionadas