rafal92909 Posted May 4, 2012 Report Share Posted May 4, 2012 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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.