[C con Clase] gtk label set text no me funciona

Steven Davidson srd4121 en njit.edu
Mar Oct 18 16:20:15 CEST 2011


Hola Hl3,

On Tue, Oct 18, 2011 at 3:31 PM, Hl3 <halowin3 en gmail.com> wrote:
> Imposible, no lo compila.

Vamos a ver el código.

> He declarado la estructura:
>
> struct bloque{
>  GtkWidget *l1,*l2;
> };
> struct bloque bl;
> ...
> ...
> bl.l1 = label1;
> bl.l2 = label2;
>
> Esto lo compila bien:
>
> g_signal_connect (GTK_BUTTON (boton1), "clicked",G_CALLBACK (clik1), (gpointer)&bl);
>
>
> Pero aqui peta:
>
> void clik1( GtkWidget *widget, gpointer   data ){
>  gtk_label_set_text(GTK_LABEL(data.l1),"Me han cambiado 1");
> }
>
> !!! Algo va mal !!!
>
> aviso: deferenciando el puntero ‘void *’
> pru.c:9: error: petición del miembro ‘l1’ en algo que no es una estructura o unión

Es normal que te lance tal error. En primer lugar, 'data' es un 'void
*', pero sabemos que la información es de tipo 'struct bloque *'.
Tienes que realizar un cásting a 'data' al tipo correcto. En segundo
lugar, como se trata de un puntero a una estructura, deberías usar el
operador -> para acceder a los miembros de la estructura apuntada. Al
final, escribe esto:

void clik1( GtkWidget *widget, gpointer data )
{
  struct bloque *pEtiquetas = (struct bloque *) data;

  gtk_label_set_text( GTK_LABEL( pEtiquetas->l1 ),"Me han cambiado 1" );
}

O si lo prefieres,

void clik1( GtkWidget *widget, gpointer data )
{
 gtk_label_set_text( GTK_LABEL( ((struct bloque *)data)->l1 ),"Me han
cambiado 1" );
}

Recuerda que C es un lenguaje FUERTEMENTE tipificado. Por otro lado, C
permite que podamos cambiar temporalmente los tipos de los datos para
que sean tratados de diferente manera, según el tipo cambiado.


Espero que esto aclare el tema.

Steven




Más información sobre la lista de distribución Cconclase