Pagina 1 di 1

Problema C+GTK

Inviato: ven 7 mag 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 7 mag 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 7 mag 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 8 mag 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 8 mag 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