Oppure

Loading
27/01/13 21:12
Dante.cpp
typedef struct {  GtkWidget *wid;   char * lab;  } Btn;

//gfc_tabella()
for ( rows = 0; rows < 4; rows++ )
    for ( cols = 0; cols < 4; cols++ )
      button[rows][cols].lab = rand_character();


esempio di output alla pressione di alcuni bottoni:

&#65533;
H&#65533;b&#65533;O
I&#65533;&#65533;L&#65533;L
typedef struct {  GtkWidget *wid;   char * lab;  } Btn;

//gfc_tabella()
for ( rows = 0; rows < 4; rows++ )
    for ( cols = 0; cols < 4; cols++ )
      button[rows][cols].lab = rand_character();


esempio di output alla pressione di alcuni bottoni:

&#65533;
H&#65533;b&#65533;O
I&#65533;&#65533;L&#65533;L{parsed_message}L&#65533;D$(H&#65533;|$ H&#65533;t$&#9618;H&#65533;T$H&#65533;LH&#65533;$H&#65533;&#65533;HA&#65533;&#65533;ffffff.&#65533;
Segmentation fault (core dumped)
L&#65533;D$(H&#65533;|$ H&#65533;t$&#9618;H&#65533;T$H&#65533;LH&#65533;$H&#65533;&#65533;HA&#65533;&#65533;ffffff.&#65533;
Segmentation fault (core dumped)
Ultima modifica effettuata da Dante.cpp 27/01/13 21:30
aaa
27/01/13 21:22
Ma non hai detto che funzionava ?
27/01/13 21:30
Dante.cpp
Funziona se la matrice di button è globale...
aaa
27/01/13 22:28
Mi sembra ovvio che la matrice debba esistere anche al di fuori della funzione grf_tastiera.

Se non la vuoi globale allora allocala dinamicamente.
28/01/13 8:47
Dante.cpp
Come vedi nella riga 11, la stringa è allocata dinamicamente... La matrice andrebbe senz'altro dichiarata globale se non passassi alla funzione un suo riferimento.

#include <gtk/gtk.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
 
typedef struct {  GtkWidget *wid;   char * lab;  } 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] = 'Come vedi nella riga 11, la stringa è allocata dinamicamente... La matrice andrebbe senz'altro dichiarata globale se non passassi alla funzione un suo riferimento.


#include <gtk/gtk.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
 
typedef struct {  GtkWidget *wid;   char * lab;  } 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( GtkWidget *widget, gpointer data )
{  
  printf("%s\n", ((Btn *)data)->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.
GtkWidget * grf_tastiera()
{
  GtkWidget *table;
  int rows, cols;
 
   Btn button[4][4];
  table = gtk_table_new (4, 4, TRUE);
 
  srand(time(NULL));
 
  for ( rows = 0; rows < 4; rows++ )
    for ( cols = 0; cols < 4; cols++ )
      button[rows][cols].lab = rand_character();

      
 
  for ( rows = 0; rows < 4; rows++ )
    for ( cols = 0; cols < 4; cols++ )
    {  
     
      button[rows][cols].wid = gtk_toggle_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[])
{
  GtkWidget * 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);
   
  gtk_main ();
  return 0;
}
'; return c; } static void grf_get_label( GtkWidget *widget, gpointer data ) { printf("%s\n", ((Btn *)data)->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. GtkWidget * grf_tastiera() { GtkWidget *table; int rows, cols; Btn button[4][4]; table = gtk_table_new (4, 4, TRUE); srand(time(NULL)); for ( rows = 0; rows < 4; rows++ ) for ( cols = 0; cols < 4; cols++ ) button[rows][cols].lab = rand_character(); for ( rows = 0; rows < 4; rows++ ) for ( cols = 0; cols < 4; cols++ ) { button[rows][cols].wid = gtk_toggle_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[]) { GtkWidget * 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); gtk_main (); return 0; }
aaa
28/01/13 8:56
Non mi hai capito ... è button[4][4] che deve essere allocata dinamicamente !
28/01/13 9:03
Dante.cpp
Si si, avevo frainteso, ora provo...
aaa
28/01/13 9:11
Dante.cpp
Funziona, ma sinceramente non ho capito perchè! Che differenza fa la modalità di allocazione con lo scope?

#include <gtk/gtk.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
 
typedef struct {  GtkWidget *wid;   char * lab;  } 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] = 'Funziona, ma sinceramente non ho capito perchè! Che differenza fa la modalità di allocazione con lo scope?


#include <gtk/gtk.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
 
typedef struct {  GtkWidget *wid;   char * lab;  } 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( GtkWidget *widget, gpointer data )
{  
  printf("%s\n", ((Btn *)data)->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.
GtkWidget * grf_tastiera()
{
  GtkWidget *table;
  int rows, cols;
 
  Btn **button;
  button = (Btn **) calloc( 4, sizeof(Btn *));
  for (rows=0; rows<4; rows++)
    button[rows]= (Btn *) calloc( 4, sizeof(Btn));
  
  table = gtk_table_new (4, 4, TRUE);
 
  srand(time(NULL));
 
  for ( rows = 0; rows < 4; rows++ )
    for ( cols = 0; cols < 4; cols++ )
      button[rows][cols].lab = rand_character();

      
 
  for ( rows = 0; rows < 4; rows++ )
    for ( cols = 0; cols < 4; cols++ )
    {  
     
      button[rows][cols].wid = gtk_toggle_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[])
{
  GtkWidget * 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);
   
  gtk_main ();
  return 0;
}
'; return c; } static void grf_get_label( GtkWidget *widget, gpointer data ) { printf("%s\n", ((Btn *)data)->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. GtkWidget * grf_tastiera() { GtkWidget *table; int rows, cols; Btn **button; button = (Btn **) calloc( 4, sizeof(Btn *)); for (rows=0; rows<4; rows++) button[rows]= (Btn *) calloc( 4, sizeof(Btn)); table = gtk_table_new (4, 4, TRUE); srand(time(NULL)); for ( rows = 0; rows < 4; rows++ ) for ( cols = 0; cols < 4; cols++ ) button[rows][cols].lab = rand_character(); for ( rows = 0; rows < 4; rows++ ) for ( cols = 0; cols < 4; cols++ ) { button[rows][cols].wid = gtk_toggle_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[]) { GtkWidget * 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); gtk_main (); return 0; }
aaa