GTK C przekazanie prametrow przez gtk_signal_connect

0

pisze sapera w gtk moj problem polega na przekazaniu zmiennych do funkcji podczas wyslania sygnalu klikniecia przycisku. Probowalem na wiele sposobow i generalnie nie ma problemu z przekazaniem do normalnego przycisku ale jak tworze tabele przyciskow w petli to nawet wartosci pojedynczej zmiennej nie przekazuje poprawnie. Potrzebuje przekazac 2 zmienne - pozycje przycisku w tabali pakujacej.

i tak:
najpierw tworze zwykla tablice 16 wierszy i 30 kolum czyli tyle ile ma samper w windowsie na najwyzszym poziomie.
pozniej rozlosowuje w tej tablicy 99 bomb a nastepnie sprawdzam sobie kazdy przycisk po kolei ile bomb go otacza i wpisuje ta wartosc w odpowiedni miejsce w tablicy
robią to funkcje:

 
void zeruj()
{
	int i=0,j=0;
	for(i=0;i<18;i++)
	 for(j=0;j<32;j++)
	  T[i][j]=0;


}


void losuj()
{

    int x,y,z=0;

    srand(time(NULL));
      do{
	x=1+rand()%16;
	y=1+rand()%30;
	if(T[x][y]==0) {T[x][y]=9; z++;}

        }while(z<99);


}

void ilebomb()
{
	int z=0,licznik=0,i=0,j=0;
	for(i=1;i<17;i++)
          for(j=1;j<31;j++)
	    {
		if(T[i][j]!=9)
		  {
			licznik=0;
			if (T[i][j-1]==9) licznik++;
			if (T[i][j+1]==9) licznik++;
			for(z=0;z<3;z++)
			   {
			      if(T[i-1][j-1+z]==9) licznik++;
			      if(T[i+1][j-1+z]==9) licznik++;
			    }
			T[i][j]=licznik;
		   }

	    }


}

nastepnie mam funkcje tworzaca tabele skladajaca sie z toogle buttonow i tabele etykiet. jezeli przycisk zostanie wklikniety uruchamia
sie funkcja show ktora wyswietla etykiete spod przycisku

 
//definicja struktury
typedef struct {
bool stanPrzycisku; /* czy wcisniety */
GtkWidget *przycisk; /* uchwyt do przycisku */
GtkWidget *label; /* uchwyt do etykiety */
bool bomba; /* czy pod przyciskiem jest bomba? */
int wiersz; /* rzad tabeli pakujacej */
int kolumna; /* kolumna tabeli pakujacej */
char etykieta;
} PrzyciskSapera;

PrzyciskSapera plansza[30][16]; //zmienna globalna



void UtworzTabele()
{

    tabela=gtk_table_new(16,30 ,TRUE);	//tworzenie tabeli pakujacej

    for(i=0;i<yy;i++)
        for(j=0;j<xx;j++)
    {
        int x = T[j+1][i+1];

        switch (x)
        {
            case 0 :
                label=gtk_label_new(" ");
                z=" ";        //tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                break;
            case 1 :
                label=gtk_label_new("1");        //tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                z="1";
                break;
            case 2 :
                label=gtk_label_new("2");        //tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                z="2";
                break;
            case 3 :
                label=gtk_label_new("3");        //tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                z="3";
                break;
            case 4 :
                label=gtk_label_new("4");        ///tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                z="4";
                break;
            case 5 :
                label=gtk_label_new("5");        //tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                z="5";
                break;
            case 6 :
                label=gtk_label_new("6");        //tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                z="6";
                break;
            case 7 :
                label=gtk_label_new("7");        //tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                z="7";
                break;
            case 8 :
                label=gtk_label_new("8");       //tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                z="8";
                break;
            case 9 :
                label=gtk_label_new("x");        //tworzy nowa etykiete w zaleznosci od tego co znajduje sie w tablicy
                z="x";
                break;
        }



        gtk_table_attach_defaults(GTK_TABLE(tabela),label,i,i+1,j,j+1);	//tworzenie tabeli etykiet

        przycisk=gtk_toggle_button_new(); //tworzenie nowego przycisku toogle button

	//wypelnienie struktury

        if (T[i][j]==9) {plansza[i][j].bomba=TRUE;}  else {plansza[j][i].bomba=FALSE;}
        plansza[j][i].kolumna=i;
        plansza[j][i].wiersz=j;
        plansza[j][i].stanPrzycisku=FALSE;
        plansza[j][i].przycisk=przycisk;
        plansza[j][i].etykieta=z;
        plansza[j][i].label=label;
        tabwsp[0]=plansza[j][i].kolumna;
        tabwsp[1]=plansza[j][i].wiersz;


        gtk_signal_connect(przycisk,"clicked",G_CALLBACK(show), label);	//obslugo sygnalu klikniecia na przycisk klikniecia
									//uruchamia funkcje show z parametrem label
									//tutaj chcialbym przkazac poprawnie i oraz j   

        gtk_widget_set_usize(GTK_WIDGET(przycisk),25,25);	//ustawienie wielkosci przycisku
        gtk_table_attach(GTK_TABLE(tabela), //tabela	wstawienie przycisku na odpowiednia pozycje w tabeli
                        przycisk,          //potomek
                        i,                 //lewo
                        i+1,                 //prawo
                        j,                 //gora
                        j+1,                 //gol
                        0,            //ile wypelnieniea do okola zostawic
                        0,            //ile wypelnieniea do okola zostawic
                        0,                 //x odstep
                        0);                //y odstep

      
        gtk_widget_show(przycisk);	//uwidacznianie kazdego z przyciskow


    }

}



//funkcja show uwidaczniajaca etykiety

 void show(GtkWidget *widget, gpointer data)
{
    gtk_widget_show(widget);
    gtk_widget_show((GtkWidget *)data);
    gtk_toggle_button_set_active(widget, TRUE);
}

gdy sygnal wcisniecia przycisku zmieniam na

  gtk_signal_connect(przycisk,"clicked",G_CALLBACK(show), i); 

gdzie i jest zwykla zmienna typu int a funkcje show zmieniam na

 
 void show(gint i, gpointer data)
{
    g_print("%d \n",i);
}

to nawet na konsoli nie wypisuje sie poprawna wartosc zmiennej i.

Chciałbym do funkcji show przekazac poprawnie parametr i oraz j, to pozwoliloby mi na korzystanie z pola plansza ktore jest tablica struktr.
Moglbym wtedy wlaczac sasiednie przyciski jezeli wcisniety jest 0, sprawdzac wygrana/przegrana, pozwoliloby mi to przyblizyc sie do ukonczenia projektu. Czy potrafi mi ktos pomoc jak i co zmienic aby przekazac te paramtery? Badz podsunac zupelnie inny "swiezy" pomysl?

0

up

0

Wystarczyło w Google poszukać jak przekazać zmienne: http://ubuntuforums.org/showthread.php?t=1367759

0

nie nie wystarczylo. problem lezal gdzie indziej

0
rafal92909 napisał(a):

//funkcja show uwidaczniajaca etykiety

void show(GtkWidget *widget, gpointer data)
{
gtk_widget_show(widget);
gtk_widget_show((GtkWidget *)data);
gtk_toggle_button_set_active(widget, TRUE);
}

> 
> gdy sygnal wcisniecia przycisku zmieniam na
> 
```c
  gtk_signal_connect(przycisk,"clicked",G_CALLBACK(show), i); 

gdzie i jest zwykla zmienna typu int a funkcje show zmieniam na

 
 void show(gint i, gpointer data)
{
    g_print("%d \n",i);
}

to nawet na konsoli nie wypisuje sie poprawna wartosc zmiennej i.

Chciałbym do funkcji show przekazac poprawnie parametr i oraz j, to pozwoliloby mi na korzystanie z pola plansza ktore jest tablica struktr.
Moglbym wtedy wlaczac sasiednie przyciski jezeli wcisniety jest 0, sprawdzac wygrana/przegrana, pozwoliloby mi to przyblizyc sie do ukonczenia projektu. Czy potrafi mi ktos pomoc jak i co zmienic aby przekazac te paramtery? Badz podsunac zupelnie inny "swiezy" pomysl?

Zerknij tu http://developer.gnome.org/gtk3/stable/GtkButton.html#GtkButton-clicked
*void user_function (GtkButton button, gpointer user_data)

Dlatego funkcja show powinna wyglądać tak:

void show(GtkButton *button, gpointer i)
{
    g_print("%d \n",i);
}
 

Napisz w jaki sposób deklarowana jest zmienna przycisk. Poza tym już się nie używa gtk_signal_connect, zamień ją na g_signal_connect.

ostatecznie powinno wyglądąć tak:

 
g_signal_connect(przycisk,"clicked",G_CALLBACK(show), (gpointer) &plansza[j][i]);       //obslugo sygnalu klikniecia na przycisk klikniecia


void show(GtkWidget *widget, gpointer *data)
{
     PrzyciskSapera *pozycja_przycisku;
 		    
     pozycja_przycisku = (PrzyciskSapera *) data;
     g_print("%d and %d \n", pozycja_przycisku->wiersz, pozycja_przycisku->kolumna);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1