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?