Jump to content

GTK+ C przekazywanie parametrow przez gtk_signal_connect


rafal92909

Recommended Posts

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 powinna dostac wspolrzedne kliknietego 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

typedef struct {
int *x;
int *y;
} wspolrzedne;
wspolrzedne wsp;

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;
wsp.x=i;
   	wsp.y=j;


   	gtk_signal_connect(przycisk,"clicked",G_CALLBACK(show), (gpointer*)&wsp);    	//obslugo sygnalu klikniecia na przycisk klikniecia

   	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

void show(wspolrzedne *wsp)
{
g_print("%d and %d \n",wsp->x, wsp->y);
}

 

 

 

 

nawet na konsoli nie wypisuje sie poprawne wartosci wspolrzednych tylko jakies kosmiczne liczby typu 7243347. Dodam ze sposob przekazywania struktury do funkcji po przez sygnal działa dla pojedynczego przycisku, zrobilem sobi mini projekt z 1 przyciskiem i przekazywanie struktury do funkcji przez sygnal dziala dobrze natomiast sposob psuje sie cos w petli.

 

Chciałbym do funkcji show przekazac poprawnie parametr i oraz j, ktore sa wspolrzednymi przyciskow w tabeli pakujacej, to pozwoliloby mi na korzystanie z pola plansza ktore jest tablica struktr.

Moglbym wtedy wlaczac przyciski, sprawdzac wygrana/przegrana, wpisywac etykiety, 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?

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...