Pagina 1 di 1

Problema C+GTK

Inviato: ven mag 07, 2010 4:13
da Slack_Eater
Ciao ho il seguente codice, GTK+C per il campo minato:

Codice: Seleziona tutto

#include <gtk/gtk.h>
#include <stdio.h>
static void check( GtkWidget *widget, gpointer   data){
   GdkColor color;
   /*
    *     char a[2];
    *         data
    *         */
   /*
    *     char test[2] = (char) data;
    *         printf("x: %d  y: %s", (int) test[0], (char) data[1]);
    *         */
   printf("button - %s was pressed\n", (char *) data);
   /*
    *     int i = (int) data[0];
    *         int a = (int) data[1];
    *         */
   gdk_color_parse( "#0080FF", &color );
   gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &color);
   gtk_widget_modify_bg(widget, GTK_STATE_SELECTED, &color);
}

static gboolean delete_event( GtkWidget *widget, GdkEvent  *event, gpointer   data ){
   g_print("delete_event\n");
   gtk_main_quit ();
   return FALSE;
}

int main( int   argc,
      char *argv[] )
{
   GtkWidget *window;
   GtkWidget *button1;
   GtkWidget *buttons[5][5];
   GtkWidget *vbox1;
   GtkWidget *table;

   gtk_init (&argc, &argv);

   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title (GTK_WINDOW (window), "MineField");

   g_signal_connect (G_OBJECT (window), "delete_event",
         G_CALLBACK (delete_event), NULL);

   gtk_container_set_border_width (GTK_CONTAINER (window), 10);
   gtk_widget_show (window); 

   vbox1 = gtk_vbox_new (FALSE, 0);
   gtk_container_add (GTK_CONTAINER (window), vbox1);

   table = gtk_table_new(5,5, 1);
   int i = 0;
   int a = 0;

   for(i = 0; i < 5; i++)
      for(a = 0; a < 5; a++){
         button1 = gtk_button_new_with_label(" ");
         buttons[i][a] = button1;
         char c[10];
      
         sprintf(c, "%d%d", i, a);

         g_signal_connect (G_OBJECT (button1), "clicked", G_CALLBACK (check), (gpointer) c);
         gtk_table_attach((GtkTable *) table, button1, i, i+1, a, a+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
      }
   
   gtk_box_pack_start (GTK_BOX(vbox1), table, TRUE, TRUE, 0);

   gtk_widget_show_all(window);
   gtk_main ();

   return 0;
}


All'interno dei due for, ho la funzione sprintf che esegue un cast di i e a in stringa e poi lo passa a g_signal_connect. Quelle sarebbero le coordinate del campo minato però il problema è che se lo fate partire e cliccate sui bottoni le coordinate restano sempre 44, ovvero l'ultimo valore che a e i assumono quando passano nel ciclo l'ultima volta. E non so dove possa essere il problema.
Se qualcuno più esperto mi può aiutare! :)

Grazie

Re: Problema C+GTK

Inviato: ven mag 07, 2010 13:24
da 414N
Innanzitutto non puoi dichiarare variabili quando ti pare come in C++ o altri linguaggi più evoluti. Devi dichiararle all'inizio del blocco che le contiene.
Altra cosa, come lo compili quel codice?
Io ho provato con

Codice: Seleziona tutto

gcc -I/usr/include/gtk-2.0 mine.c
ma mi da una svalangata di errori. Quali flags usi?

Re: Problema C+GTK

Inviato: ven mag 07, 2010 14:39
da Slack_Eater
Ciao,

uso questo per compilare:

Codice: Seleziona tutto

gcc -g -o file file.c `pkg-config --libs --cflags gtk+-2.0`


Per le variabili lo so che avrei dovuto dichiararle all'inizio ma ho fatto tutto un pò di fretta, grazie lo stesso per il consiglio.

Re: Problema C+GTK

Inviato: sab mag 08, 2010 17:50
da FireEater
Ciao,

così su due piedi credo che il problema derivi da:

Codice: Seleziona tutto

char c[10];
sprintf(c, "%d%d", i, a);

g_signal_connect (G_OBJECT (button1), "clicked", G_CALLBACK (check), (gpointer) c);


non conosco le gtk, comunque c è un puntatore e tu stai dando il suo riferimento alla g_signal_connect di conseguenza al termine del for tutti i tasti punteranno a c che ormai vale 44.

Prova con una matrice c[25][10] per verificare se il problema è veramente questo.

FireEater

Re: Problema C+GTK

Inviato: sab mag 08, 2010 22:21
da Slack_Eater
Ciao, grazie per la risposta ma nel frattempo ho risolto in questo modo:

Codice: Seleziona tutto

  for (i = 0; i < 5; i++)
                for (a = 0; a < 5; a++) {
                        tab[i][a] = 0;
                        button1 = gtk_button_new_with_label(" ");
                        buttons[i][a] = button1;

                        MyCoordinate *c = g_slice_new(MyCoordinate);
                        c->x = i;
                        c->y = a;

                        g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(check), c);
                        gtk_table_attach((GtkTable *) table, button1, i, i + 1, a, a + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
                }



Cosi ora funziona, la funzione g_slice_new mi allocca la memoria giusta in modo da non permettere sempre la sovrascrittura di c.
Grazie per le risposte! :o