inny1997 Temat założony przez niniejszego użytkownika |
Błąd: "segmentation fault" » 2010-08-16 11:14:55 witam jestem w trakcie tworzenia programu do gry w kółko i krzyżyk z komputerem oto kod [ code / ] #include<iostream> #include<conio.h> using namespace std;
int tab[ 3 ][ 3 ][ 2 ] = { { { 0, 0 }, { 0, 0 }, { 0, 0 } }, { { 0, 0 }, { 0, 0 }, { 0, 0 } }, { { 0, 0 }, { 0, 0 }, { 0, 0 } } };
int main() { int * tab_zak[ 9 ][ 3 ] = { { & tab[ 0 ][ 0 ][ 0 ], & tab[ 0 ][ 1 ][ 0 ], & tab[ 0 ][ 2 ][ 0 ] }, { & tab[ 1 ][ 0 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 1 ][ 2 ][ 0 ] }, { & tab[ 2 ][ 0 ][ 0 ], & tab[ 2 ][ 1 ][ 0 ], & tab[ 2 ][ 2 ][ 0 ] }, { & tab[ 0 ][ 0 ][ 0 ], & tab[ 1 ][ 0 ][ 0 ], & tab[ 2 ][ 0 ][ 0 ] }, { & tab[ 0 ][ 1 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 2 ][ 1 ][ 0 ] }, { & tab[ 0 ][ 2 ][ 0 ], & tab[ 1 ][ 2 ][ 0 ], & tab[ 2 ][ 2 ][ 0 ] }, { & tab[ 0 ][ 0 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 2 ][ 2 ][ 0 ] }, { & tab[ 0 ][ 2 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 2 ][ 0 ][ 0 ] } }; int koniec; int tury = 0; int xgr1; int ygr1; int xgr2; int ygr2; int i; int b; int a; b = 0; koniec = 2; while( koniec == 2 ) { tury++; cin >> xgr1; cin >> ygr1; xgr1--; ygr1--; tab[ xgr1 ][ ygr1 ][ 0 ] = 1; cout << tab[ 0 ][ 0 ][ 0 ] << tab[ 0 ][ 1 ][ 0 ] << tab[ 0 ][ 2 ][ 0 ] << endl << tab[ 1 ][ 0 ][ 0 ] << tab[ 1 ][ 1 ][ 0 ] << tab[ 1 ][ 2 ][ 0 ] << endl << tab[ 2 ][ 0 ][ 0 ] << tab[ 2 ][ 1 ][ 0 ] << tab[ 2 ][ 2 ][ 0 ] << endl; cout <<* tab_zak[ 0 ][ 0 ]; if( * tab_zak[ 0 ][ 0, 1, 2 ] == 1 || * tab_zak[ 1 ][ 0, 1, 2 ] == 1 || * tab_zak[ 2 ][ 0, 1, 2 ] == 1 || * tab_zak[ 3 ][ 0, 1, 2 ] == 1 || * tab_zak[ 4 ][ 0, 1, 2 ] == 1 || * tab_zak[ 5 ][ 0, 1, 2 ] == 1 || * tab_zak[ 6 ][ 0, 1, 2 ] == 1 || * tab_zak[ 7 ][ 0, 1, 2 ] == 1 || * tab_zak[ 8 ][ 0, 1, 2 ] == 1 ) { cout << "wygrał gracz1" << endl; } tury++; cin >> xgr2; cin >> ygr2; xgr2--; ygr2--; cout << tab[ 0 ][ 0 ][ 0 ] << tab[ 0 ][ 1 ][ 0 ] << tab[ 0 ][ 2 ][ 0 ] << endl << tab[ 1 ][ 0 ][ 0 ] << tab[ 1 ][ 1 ][ 0 ] << tab[ 1 ][ 2 ][ 0 ] << endl << tab[ 2 ][ 0 ][ 0 ] << tab[ 2 ][ 1 ][ 0 ] << tab[ 2 ][ 2 ][ 0 ] << endl; tab[ xgr2 ][ ygr2 ][ 0 ] = 2; if( * tab_zak[ 0 ][ 0, 1, 2 ] == 1 || * tab_zak[ 1 ][ 0, 1, 2 ] == 1 || * tab_zak[ 2 ][ 0, 1, 2 ] == 1 || * tab_zak[ 3 ][ 0, 1, 2 ] == 1 || * tab_zak[ 4 ][ 0, 1, 2 ] == 1 || * tab_zak[ 5 ][ 0, 1, 2 ] == 1 || * tab_zak[ 6 ][ 0, 1, 2 ] == 1 || * tab_zak[ 7 ][ 0, 1, 2 ] == 1 || * tab_zak[ 8 ][ 0, 1, 2 ] == 1 || * tab_zak[ 9 ][ 0, 1, 2 ] == 1 ) { cout << "wygrał gracz 2 " << endl; } if( tury == 9 ) { cout << "remis" << endl; } } }
program się kompiluje ,ale po urochomieniu i podaniu zmiennych xgr1 i ygr1 (współrzędnych)program się zawiesza z debugowania dowiedziałem się, że wystąpił błąd segmentacji. W internecie dowiedzałem się że taki błąd wyskakuje jeżeli tablica niema uprawnień do pewnych danych. przypuszczam, że tablica tab_zak niema dokładnie przypisanych danych i niemoże dostarczać danych przez adres zmiennej. Jeżeli moje przypuszczenia są słuszne to dlaczego po poleceniu cout<<*tab_zak[0][0]; wyświetla mi wartość skoro niema do niej dostępu. |
|
lenrokskate |
» 2010-08-16 11:42:51 otaguj kod [code src="C++" zwin][/code] |
|
ison |
» 2010-08-16 12:12:34 człowieku, co ty żeś tam namieszał? Jeśli chcesz zachować czytelność kodu to nie rób w razie możliwości tablic 3-wymiarowych bo potem będziesz miał problem tak jak teraz z debugowaniem nie wystarczyło zwyczajnie: int plansza[ 3 ][ 3 ] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };
? |
|
inny1997 Temat założony przez niniejszego użytkownika |
» 2010-08-16 12:29:28 ta tablica trzywymiarowa ma dwia zadania pierwszy służy jako plansza (0-puste pole 1- kółko 2-krzyżyk) ,a drugie za pomocą wartości pola określa na które pole komputer ma postawić. trzeci wymiar ma za za zadanie odróżnić te dwa tryby. wolałem mieć dwie tablice niż trzy,a poza tym problem jest w tablicy tab_zak, która miała posiadać wszystkie możliwości wygranej i dlatego potrzebne są adresy do pól w planszy(tablicy tab)aby łatwiej operować całym programem. |
|
ison |
» 2010-08-16 12:31:46 dobra, w każdym razie znalazłem błąd w tym miejscu: int * tab_zak[ 9 ][ 3 ] = { { & tab[ 0 ][ 0 ][ 0 ], & tab[ 0 ][ 1 ][ 0 ], & tab[ 0 ][ 2 ][ 0 ] }, { & tab[ 1 ][ 0 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 1 ][ 2 ][ 0 ] }, { & tab[ 2 ][ 0 ][ 0 ], & tab[ 2 ][ 1 ][ 0 ], & tab[ 2 ][ 2 ][ 0 ] }, { & tab[ 0 ][ 0 ][ 0 ], & tab[ 1 ][ 0 ][ 0 ], & tab[ 2 ][ 0 ][ 0 ] }, { & tab[ 0 ][ 1 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 2 ][ 1 ][ 0 ] }, { & tab[ 0 ][ 2 ][ 0 ], & tab[ 1 ][ 2 ][ 0 ], & tab[ 2 ][ 2 ][ 0 ] }, { & tab[ 0 ][ 0 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 2 ][ 2 ][ 0 ] }, { & tab[ 0 ][ 2 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 2 ][ 0 ][ 0 ] } };
a w tym ifie: if( * tab_zak[ 0 ][ 0, 1, 2 ] == 1 || * tab_zak[ 1 ][ 0, 1, 2 ] == 1 || * tab_zak[ 2 ][ 0, 1, 2 ] == 1 || * tab_zak[ 3 ][ 0, 1, 2 ] == 1 || * tab_zak[ 4 ][ 0, 1, 2 ] == 1 || * tab_zak[ 5 ][ 0, 1, 2 ] == 1 || * tab_zak[ 6 ][ 0, 1, 2 ] == 1 || * tab_zak[ 7 ][ 0, 1, 2 ] == 1 || * tab_zak[ 8 ][ 0, 1, 2 ] == 1 ) { cout << "wygrał gracz1" << endl; }
//edit co więcej! w dalszej części kodu: if( * tab_zak[ 0 ][ 0, 1, 2 ] == 1 || * tab_zak[ 1 ][ 0, 1, 2 ] == 1 || * tab_zak[ 2 ][ 0, 1, 2 ] == 1 || * tab_zak[ 3 ][ 0, 1, 2 ] == 1 || * tab_zak[ 4 ][ 0, 1, 2 ] == 1 || * tab_zak[ 5 ][ 0, 1, 2 ] == 1 || * tab_zak[ 6 ][ 0, 1, 2 ] == 1 || * tab_zak[ 7 ][ 0, 1, 2 ] == 1 || * tab_zak[ 8 ][ 0, 1, 2 ] == 1 || * tab_zak[ 9 ][ 0, 1, 2 ] == 1 ) ...
|
|
inny1997 Temat założony przez niniejszego użytkownika |
» 2010-08-16 12:45:57 skompilował się i działa poprawnie .
|
|
pekfos |
» 2010-08-16 12:46:59 to zamknij temat jeśli nie masz więcej pytań do tego teamtu |
|
« 1 » |