Problema C+GTK

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0
Località: Svizzera
Contatta:

Problema C+GTK

Messaggioda Slack_Eater » ven mag 07, 2010 4:13

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

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2893
Iscritto il: mer feb 13, 2008 16:19
Slackware: 14.2
Kernel: 4.4.19
Desktop: KDE4
Località: Bulagna
Contatta:

Re: Problema C+GTK

Messaggioda 414N » ven mag 07, 2010 13:24

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?

Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0
Località: Svizzera
Contatta:

Re: Problema C+GTK

Messaggioda Slack_Eater » ven mag 07, 2010 14:39

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.

Avatar utente
FireEater
Linux 2.6
Linux 2.6
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4
Località: Cagliari <---> Torino
Contatta:

Re: Problema C+GTK

Messaggioda FireEater » sab mag 08, 2010 17:50

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

Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0
Località: Svizzera
Contatta:

Re: Problema C+GTK

Messaggioda Slack_Eater » sab mag 08, 2010 22:21

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


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti