Programando en GTK+ en C - Problema con las variables

Me explico, estoy programando con GTK+-2.0 + C y tengo un problema con las funciones de rellamada.

Unicamente puedo pasar un unico parametro que es del tipo gpointer y yo necesito pasar varios parametros. Pense en un array, pero no hay manera de coger un elemento que no sea el primero sin que me de una bonita violacion de segmento. Lo que hacia era:

funcion_main() {
       GtkWidget *unWidget, *otroWidget;
       gpointer array[2];
       /* Aqui trabajo con los widgets */
       array[0] = (gpointer) unWidget;
       array[1] = (gpointer) otroWidget;
       gtk_signal_connect (GTK_OBJECT (mi_objeto_para_el_evento), "mi_evento",GTK_SIGNAL_FUNC (mi_funcion_asociada), array);
       /* Resto de programa */
       return 0;
}

gint mi_funcion_asociada(GtkWidget *w, GdkEvent *e, gpointer mis_datos){
       GtkWidget *nuevoWidget, *otronuevoWidget;
       nuevoWidget = (GtkWidget) mis_datos[0];
       otronuevoWidget = (GtkWidget) mis_datos[1];
       /* uso de la funcion */
       return 0;
}



Pero eso, a pesar de no darme error a la hora de compilar, cuando utilizo los widgets, me da un segmentation fault por que creo que no accede bien a las posiciones de memoria. He probado ademas, refiriendome a los punteros de otras formas (puntero +1, por ejemplo) pero me sigue fallando.

La otra opcion, eran las estructuras, pero cuando paso un puntero de la estructura y despues utilizo los miembros el compilador parece que me put** diciendome que si en vez de -> quiero poner . :S

He buscado por google, pero la verdad que no he encontrado nada que me pueda ser util.

Ahora mismo lo tengo como variables globales, pero me parece una chapuza por que, entre otras cosas, queria dividir el programa en varios ficheros y haciendolo asi no puedo.

Cualquier ayuda será bien recibida :)

Salu2 y muchas gracias!

PD: Los widget estan bien tratados, ya que si los paso de uno en uno como (gpointer) unWidget, no me produce ningun fallo.
PD2: No se si sera util, gpointer es un puntero a void.
Tienes que usar estructuras. Por ejemplo:

struct mis_argumentos {
    int a;
    char b;
    double c;
};

...

void funcion(GtkWidget *w, GdkEvent *e, gpointer data)
{
    struct mis_argumentos *args = data;
    if (args->a == 0)
        return;
    /* blablablablablabla */
}


La estructura, obviamente, puede contener los miembros que tu quieras y necesites.

- ferdy
Muchisimas gracias, ya funciona :) Creo que mi problema era que trataba directamente el puntero que recibia, en vez de asignarlos antes a un puntero declarado en la función :)

Muchisimas gracias! :D
Si, por alguna estúpida razón, necesitaras hacer eso:

int f(GtkWidget *e, gpointer data)
{
    return ((struct mis_argumentos*)data)->a;
}


Pero es una estúpida idea :)

- ferdy
3 respuestas