Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Błąd: "segmentation fault"

Ostatnio zmodyfikowano 2010-08-16 12:46
Autor Wiadomość
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
C/C++
[ 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.
P-20854
lenrokskate
» 2010-08-16 11:42:51
otaguj kod [code src="C++" zwin][/code]
P-20856
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:
C/C++
int plansza[ 3 ][ 3 ] =
{
    { 0, 0, 0 },
    { 0, 0, 0 },
    { 0, 0, 0 }
};
?
P-20858
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.
 
P-20862
ison
» 2010-08-16 12:31:46
dobra, w każdym razie znalazłem błąd
w tym miejscu:
C/C++
int * tab_zak[ 9 ][ 3 ] = //policz ile tego deklarujesz
{
    { & tab[ 0 ][ 0 ][ 0 ], & tab[ 0 ][ 1 ][ 0 ], & tab[ 0 ][ 2 ][ 0 ] }, //0
    { & tab[ 1 ][ 0 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 1 ][ 2 ][ 0 ] }, //1
    { & tab[ 2 ][ 0 ][ 0 ], & tab[ 2 ][ 1 ][ 0 ], & tab[ 2 ][ 2 ][ 0 ] }, //2
    { & tab[ 0 ][ 0 ][ 0 ], & tab[ 1 ][ 0 ][ 0 ], & tab[ 2 ][ 0 ][ 0 ] }, //3
    { & tab[ 0 ][ 1 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 2 ][ 1 ][ 0 ] }, //4
    { & tab[ 0 ][ 2 ][ 0 ], & tab[ 1 ][ 2 ][ 0 ], & tab[ 2 ][ 2 ][ 0 ] }, //5
    { & tab[ 0 ][ 0 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 2 ][ 2 ][ 0 ] }, //6
    { & tab[ 0 ][ 2 ][ 0 ], & tab[ 1 ][ 1 ][ 0 ], & tab[ 2 ][ 0 ][ 0 ] } //7
};
a w tym ifie:
C/C++
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 ) //odwołujesz się do 8 elementu
{
    cout << "wygrał gracz1" << endl;
}

//edit co więcej!
w dalszej części kodu:
C/C++
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 || //nie dosyć że pod ten element nic nie przypisałeś
* tab_zak[ 9 ][ 0, 1, 2 ] == 1 ) //to jeszcze odwołujesz się do 9 elementu który w ogóle nie istnieje w tablicy tab_zak, jeśli podałeś rozmiar tablicy 9 to jego indeksy wynoszą kolejno: 0,1,2,3,4,5,6,7,8
...
P-20863
inny1997
Temat założony przez niniejszego użytkownika
» 2010-08-16 12:45:57
skompilował się i działa poprawnie .
P-20867
pekfos
» 2010-08-16 12:46:59
to zamknij temat jeśli nie masz więcej pytań do tego teamtu
P-20868
« 1 »
  Strona 1 z 1