Oppure

Loading
27/01/13 14:59
Dante.cpp
Alla pressione di un qualsiasi bottone, la funzione viene chiamata ma la stringa but.lab è sempre vuota, infatti chiamando la funzione stampa solo \n...

#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] = 'Alla pressione di un qualsiasi bottone, la funzione viene chiamata ma la stringa but.lab è sempre vuota, infatti chiamando la funzione stampa solo \n...


#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] = '{parsed_message}';
  
  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);
'; 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 27/01/13 15:01
aaa
27/01/13 15:04
nessuno
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à.
27/01/13 15:27
Umberto
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.
aaa
27/01/13 16:34
tasx
includendo le gtk le glib sono già incluse...
aaa
27/01/13 16:54
Dante.cpp
La stringa è di due caratteri, uno casuale più 'La stringa è di due caratteri, uno casuale più '{parsed_message}'; quindi all'esecuzione di:

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:

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()'; quindi all'esecuzione di:

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:

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()
aaa
27/01/13 17:16
nessuno
Sei certo che il carattere casuale sia tra quelli visibili ?

Dato che la struttura viene passata per indirizzo, dovrebbe essere

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à.
27/01/13 17:36
Dante.cpp

Passo un rifferimento dell'oggetto alla g_signal_connect

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:

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


o cosi:

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


l'output è lo stesso.
aaa
27/01/13 18:02
nessuno
Non conosco Gtk+ ma da quello che leggo dovrebbe essere

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à.