Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Gtk+ passaggio di parametri con g_signal_connect()
Forum - C/C++ - Gtk+ passaggio di parametri con g_signal_connect()

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 15:59
Domenica, 27/01/2013
Alla pressione di un qualsiasi bottone, la funzione viene chiamata ma la stringa but.lab è sempre vuota, infatti chiamando la funzione stampa solo \n...

Codice sorgente - presumibilmente C++

  1. #include <gtk/gtk.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4.  
  5. typedef struct {  GtkWidget *wid;   char lab[2];  } Btn;
  6.  
  7. //restituisce un carattere casuale seguito da /0...
  8. char *rand_character()
  9. {
  10.   char * c = calloc( 2, sizeof(char));
  11.  
  12.   c[0] = 'a' + rand() % ('z'-'a') ;
  13.   c[1] = '\0';
  14.  
  15.   return c;
  16. }
  17.  
  18. static void grf_get_label( Btn but )
  19. {  
  20.   printf("%s\n",but.lab);
  21. }
  22.  
  23. //restituisce una tastiera 4*4 con dei caratteri aleatori come etichette, ad ogni pulsante è collegata
  24. //una funzione  "grf_get_label" che stampa in stdout il carattere d'etichetta del bottone premuto.
  25. Grf grf_tastiera()
  26. {
  27.   GtkWidget *table;
  28.   Btn button[4][4];
  29.   int rows, cols;
  30.  
  31.   table = gtk_table_new (4, 4, TRUE);
  32.  
  33.   srand(time(NULL));
  34.  
  35.   for ( rows = 0; rows < 4; rows++ )
  36.     for ( cols = 0; cols < 4; cols++ )
  37.       strcpy(button[rows][cols].lab, rand_character());
  38.  
  39.   for ( rows = 0; rows < 4; rows++ )
  40.     for ( cols = 0; cols < 4; cols++ )
  41.     {  
  42.      
  43.       button[rows][cols].wid = gtk_button_new_with_label(button[rows][cols].lab);
  44.       gtk_table_attach (GTK_TABLE (table), button[rows][cols].wid, cols, cols + 1,
  45.                         rows, rows + 1, GTK_FILL | GTK_EXPAND,
  46.                         GTK_FILL | GTK_EXPAND, 0, 0);
  47.      
  48.       g_signal_connect (G_OBJECT (button[rows][cols].wid), "clicked",
  49.                         G_CALLBACK (grf_get_label), &button[rows][cols]);
  50.     }
  51.  
  52.   return table;
  53. }
  54.  
  55.  
  56. int main(int argc, char *argv[])
  57. {
  58.   Grf window;
  59.  
  60.   gtk_init (&argc, &argv);
  61.  
  62.      //finestra principale
  63.   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  64.   gtk_window_set_title (GTK_WINDOW (window), "Tastiera");
  65.   gtk_window_set_default_size(GTK_WINDOW(window) , 200 , 210);
  66.   gtk_window_set_position (GTK_WINDOW (window) , GTK_WIN_POS_CENTER);
  67.   gtk_container_set_border_width (GTK_CONTAINER (window), 9);
  68.  
  69.   //posiziona una tastiera 4*4 nella finestra
  70.   gtk_container_add (GTK_CONTAINER (window), grf_tastiera());
  71.  
  72.   gtk_widget_show_all (window);
  73.  
  74.   g_signal_connect (G_OBJECT (window), "delete_event",
  75.                      G_CALLBACK (gtk_main_quit), NULL);


Ultima modifica effettuata da Dante.cpp il 27/01/2013 alle 16:01
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:04
Domenica, 27/01/2013
Scusa ... ma la stringa è di due caratteri

char lab[2];

compreso il terminatore. Cosa ti aspetti?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Umberto (Member)
Pro


Messaggi: 156
Iscritto: 27/09/2011

Segnala al moderatore
Postato alle 16:27
Domenica, 27/01/2013
Visto che stai già usando le gtk+ , potresti includere anche le glib e provare dichiarano una GString , non avresti problemi con in numero dei caratteri.


PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 17:34
Domenica, 27/01/2013
includendo le gtk le glib sono già incluse...


... sei un proxy che perde i pacchetti ...
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 17:54
Domenica, 27/01/2013
La stringa è di due caratteri, uno casuale più '\0'; quindi all'esecuzione di:

Codice sorgente - presumibilmente Plain Text

  1. printf("%s\n",but.lab);



m'aspetto che venga stampato il carattere aleatorio, primo elemento della stringa 'but.lab'. Dopodichè può essere stampato '\n'.

La struttura GString:

Codice sorgente - presumibilmente C/C++

  1. struct GString {
  2.   gchar  *str;
  3.   gsize len;
  4.   gsize allocated_len;
  5. };



può essere utile, tuttavia anche con GString i parametri non riescono ad'arrivare alla funzione tramite g_signal_connect()

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:16
Domenica, 27/01/2013
Sei certo che il carattere casuale sia tra quelli visibili ?

Dato che la struttura viene passata per indirizzo, dovrebbe essere

Codice sorgente - presumibilmente C/C++

  1. static void grf_get_label( Btn *but )
  2. {  
  3.   printf("%s\n",  but->lab);
  4. }



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 18:36
Domenica, 27/01/2013

Passo un rifferimento dell'oggetto alla g_signal_connect

Codice sorgente - presumibilmente Plain Text

  1. g_signal_connect (G_OBJECT (button[rows][cols].wid), "clicked",
  2.                         G_CALLBACK (grf_get_label), &button[rows][cols]);



comunque sia indipendentemente da come definisco la grf_get_label, cosi:

Codice sorgente - presumibilmente C/C++

  1. static void grf_get_label( Btn *but ) {     printf("%s\n",  but->lab);  }



o cosi:

Codice sorgente - presumibilmente C/C++

  1. static void grf_get_label( Btn but ) {     printf("%s\n",  but.lab);  }



l'output è lo stesso.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5461
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:02
Domenica, 27/01/2013
Non conosco Gtk+ ma da quello che leggo dovrebbe essere

Codice sorgente - presumibilmente C/C++

  1. void grf_get_label(GtkWidget *widget, gpointer data)
  2.  {
  3.    printf("%s\n", ((But *)data)->lab);
  4.  }



Ovviamente non ho provato ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 19:50
Domenica, 27/01/2013
Provato, ecco un'esempio di output:

`�




`�
EB�

PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo