Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
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++ |
#include <gtk/gtk.h> #include<stdlib.h> #include<time.h> typedef struct { GtkWidget *wid; char lab[2]; } Btn; //restituisce un carattere casuale seguito da /0... char *rand_character() { char * c = calloc( 2, sizeof(char)); c[0] = 'a' + rand() % ('z'-'a') ; c[1] = '\0'; return c; } static void grf_get_label( Btn but ) { printf("%s\n",but.lab); } //restituisce una tastiera 4*4 con dei caratteri aleatori come etichette, ad ogni pulsante è collegata //una funzione "grf_get_label" che stampa in stdout il carattere d'etichetta del bottone premuto. Grf grf_tastiera() { GtkWidget *table; Btn button[4][4]; int rows, cols; table = gtk_table_new (4, 4, TRUE); srand(time(NULL)); for ( rows = 0; rows < 4; rows++ ) for ( cols = 0; cols < 4; cols++ ) strcpy(button[rows][cols].lab, rand_character()); for ( rows = 0; rows < 4; rows++ ) for ( cols = 0; cols < 4; cols++ ) { button[rows][cols].wid = gtk_button_new_with_label(button[rows][cols].lab); gtk_table_attach (GTK_TABLE (table), button[rows][cols].wid, cols, cols + 1, rows, rows + 1, GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 0, 0); g_signal_connect (G_OBJECT (button[rows][cols].wid), "clicked", G_CALLBACK (grf_get_label), &button[rows][cols]); } return table; } int main(int argc, char *argv[]) { Grf window; gtk_init (&argc, &argv); //finestra principale window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "Tastiera"); gtk_window_set_default_size(GTK_WINDOW(window) , 200 , 210); gtk_window_set_position (GTK_WINDOW (window) , GTK_WIN_POS_CENTER); gtk_container_set_border_width (GTK_CONTAINER (window), 9); //posiziona una tastiera 4*4 nella finestra gtk_container_add (GTK_CONTAINER (window), grf_tastiera()); gtk_widget_show_all (window); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL);
|
Ultima modifica effettuata da Dante.cpp il 27/01/2013 alle 16:01 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Umberto (Member)
Pro
Messaggi: 156
Iscritto: 27/09/2011
|
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.
|
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
includendo le gtk le glib sono già incluse...
|
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
La stringa è di due caratteri, uno casuale più '\0'; quindi all'esecuzione di:
Codice sorgente - presumibilmente Plain Text |
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++ |
struct GString {
gchar *str;
gsize len;
gsize allocated_len;
};
|
può essere utile, tuttavia anche con GString i parametri non riescono ad'arrivare alla funzione tramite g_signal_connect() |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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++ |
static void grf_get_label( Btn *but )
{
printf("%s\n", but->lab);
}
|
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
Passo un rifferimento dell'oggetto alla g_signal_connect
Codice sorgente - presumibilmente Plain Text |
g_signal_connect (G_OBJECT (button[rows][cols].wid), "clicked",
G_CALLBACK (grf_get_label), &button[rows][cols]);
|
comunque sia indipendentemente da come definisco la grf_get_label, cosi:
Codice sorgente - presumibilmente C/C++ |
static void grf_get_label( Btn *but ) { printf("%s\n", but->lab); }
|
o cosi:
Codice sorgente - presumibilmente C/C++ |
static void grf_get_label( Btn but ) { printf("%s\n", but.lab); }
|
l'output è lo stesso.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Non conosco Gtk+ ma da quello che leggo dovrebbe essere
Codice sorgente - presumibilmente C/C++ |
void grf_get_label(GtkWidget *widget, gpointer data)
{
printf("%s\n", ((But *)data)->lab);
}
|
Ovviamente non ho provato ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
Provato, ecco un'esempio di output:
`�
�
�
`�
EB�
|
|