Repository 32bit  Forum
Repository 64bit  Wiki

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.

Problema C+GTK

Messaggioda Slack_Eater » ven mag 07, 2010 3: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
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Problema C+GTK

Messaggioda 414N » ven mag 07, 2010 12: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
414N
Iper Master
Iper Master
 
Messaggi: 2882
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Problema C+GTK

Messaggioda Slack_Eater » ven mag 07, 2010 13: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
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0

Re: Problema C+GTK

Messaggioda FireEater » sab mag 08, 2010 16: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
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

Re: Problema C+GTK

Messaggioda Slack_Eater » sab mag 08, 2010 21: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
Avatar utente
Slack_Eater
Linux 2.0
Linux 2.0
 
Messaggi: 163
Iscritto il: gio feb 14, 2008 21:29
Località: Svizzera
Nome Cognome: Giuseppe Scalzi
Slackware: 13.37
Kernel: 2.6.38.2-smp
Desktop: KDE 4.7.0


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Yahoo [Bot] e 2 ospiti