• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

(c++) Program przestał działać.

Object Storage Arubacloud
0 głosów
699 wizyt
pytanie zadane 1 grudnia 2016 w C i C++ przez kostiw Nowicjusz (170 p.)
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

string napis;
char tab[10][20];
int w1,w2,w3,w4;
void plansza();
void gra(int &numer);
void domyslnie();
void lewo1(int a, int b, int &w1);
void prawo1(int a, int b, int &w2);
void dol1(int a, int b, int &w3);
void gora1(int a, int b, int &w4);
void w1_w3(int w1, int w3, int a);
void w4_w1(int w4, int w1, int b);
void w3_w2(int w3, int w2, int b);
void w2_w4(int w2, int w4, int a);
void zwyciestwo(int buf);

int buf=0;
int numer=1;
char x = 'x';
char o = 'o';
int main()
{
domyslnie();
gra(numer);
}

void plansza()
{
	cout << endl << endl << endl << endl << endl;
	cout << "                     "<<"  _______________________________________" << endl;
	cout << "                     "<<" |a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|" << endl;
	cout << "                     "<<"0|"<<tab[0][0]<<"|"<<tab[0][1]<<"|"<<tab[0][2]<<"|"<<tab[0][3]<<"|"<<tab[0][4]<<"|"<<tab[0][5]<<"|"<<tab[0][6]<<"|"<<tab[0][7]<<"|"<<tab[0][8]<<"|"<<tab[0][9]<<"|"<<tab[0][10]<<"|"<<tab[0][11]<<"|"<<tab[0][12]<<"|"<<tab[0][13]<<"|"<<tab[0][14]<<"|"<<tab[0][15]<<"|"<<tab[0][16]<<"|"<<tab[0][17]<<"|"<<tab[0][18]<<"|"<<tab[0][19]<<"|"<<endl;
	cout << "                     "<<"1|"<<tab[1][0]<<"|"<<tab[1][1]<<"|"<<tab[1][2]<<"|"<<tab[1][3]<<"|"<<tab[1][4]<<"|"<<tab[1][5]<<"|"<<tab[1][6]<<"|"<<tab[1][7]<<"|"<<tab[1][8]<<"|"<<tab[1][9]<<"|"<<tab[1][10]<<"|"<<tab[1][11]<<"|"<<tab[1][12]<<"|"<<tab[1][13]<<"|"<<tab[1][14]<<"|"<<tab[1][15]<<"|"<<tab[1][16]<<"|"<<tab[1][17]<<"|"<<tab[1][18]<<"|"<<tab[1][19]<<"|"<<endl;
	cout << "                     "<<"2|"<<tab[2][0]<<"|"<<tab[2][1]<<"|"<<tab[2][2]<<"|"<<tab[2][3]<<"|"<<tab[2][4]<<"|"<<tab[2][5]<<"|"<<tab[2][6]<<"|"<<tab[2][7]<<"|"<<tab[2][8]<<"|"<<tab[2][9]<<"|"<<tab[2][10]<<"|"<<tab[2][11]<<"|"<<tab[2][12]<<"|"<<tab[2][13]<<"|"<<tab[2][14]<<"|"<<tab[2][15]<<"|"<<tab[2][16]<<"|"<<tab[2][17]<<"|"<<tab[2][18]<<"|"<<tab[2][19]<<"|"<<endl;
	cout << "                     "<<"3|"<<tab[3][0]<<"|"<<tab[3][1]<<"|"<<tab[3][2]<<"|"<<tab[3][3]<<"|"<<tab[3][4]<<"|"<<tab[3][5]<<"|"<<tab[3][6]<<"|"<<tab[3][7]<<"|"<<tab[3][8]<<"|"<<tab[3][9]<<"|"<<tab[3][10]<<"|"<<tab[3][11]<<"|"<<tab[3][12]<<"|"<<tab[3][13]<<"|"<<tab[3][14]<<"|"<<tab[3][15]<<"|"<<tab[3][16]<<"|"<<tab[3][17]<<"|"<<tab[3][18]<<"|"<<tab[3][19]<<"|"<<endl;
	cout << "                     "<<"4|"<<tab[4][0]<<"|"<<tab[4][1]<<"|"<<tab[4][2]<<"|"<<tab[4][3]<<"|"<<tab[4][4]<<"|"<<tab[4][5]<<"|"<<tab[4][6]<<"|"<<tab[4][7]<<"|"<<tab[4][8]<<"|"<<tab[4][9]<<"|"<<tab[4][10]<<"|"<<tab[4][11]<<"|"<<tab[4][12]<<"|"<<tab[4][13]<<"|"<<tab[4][14]<<"|"<<tab[4][15]<<"|"<<tab[4][16]<<"|"<<tab[4][17]<<"|"<<tab[4][18]<<"|"<<tab[4][19]<<"|"<<endl;
	cout << "                     "<<"5|"<<tab[5][0]<<"|"<<tab[5][1]<<"|"<<tab[5][2]<<"|"<<tab[5][3]<<"|"<<tab[5][4]<<"|"<<tab[5][5]<<"|"<<tab[5][6]<<"|"<<tab[5][7]<<"|"<<tab[5][8]<<"|"<<tab[5][9]<<"|"<<tab[5][10]<<"|"<<tab[5][11]<<"|"<<tab[5][12]<<"|"<<tab[5][13]<<"|"<<tab[5][14]<<"|"<<tab[5][15]<<"|"<<tab[5][16]<<"|"<<tab[5][17]<<"|"<<tab[5][18]<<"|"<<tab[5][19]<<"|"<<endl;
	cout << "                     "<<"6|"<<tab[6][0]<<"|"<<tab[6][1]<<"|"<<tab[6][2]<<"|"<<tab[6][3]<<"|"<<tab[6][4]<<"|"<<tab[6][5]<<"|"<<tab[6][6]<<"|"<<tab[6][7]<<"|"<<tab[6][8]<<"|"<<tab[6][9]<<"|"<<tab[6][10]<<"|"<<tab[6][11]<<"|"<<tab[6][12]<<"|"<<tab[6][13]<<"|"<<tab[6][14]<<"|"<<tab[6][15]<<"|"<<tab[6][16]<<"|"<<tab[6][17]<<"|"<<tab[6][18]<<"|"<<tab[6][19]<<"|"<<endl;
	cout << "                     "<<"7|"<<tab[7][0]<<"|"<<tab[7][1]<<"|"<<tab[7][2]<<"|"<<tab[7][3]<<"|"<<tab[7][4]<<"|"<<tab[7][5]<<"|"<<tab[7][6]<<"|"<<tab[7][7]<<"|"<<tab[7][8]<<"|"<<tab[7][9]<<"|"<<tab[7][10]<<"|"<<tab[7][11]<<"|"<<tab[7][12]<<"|"<<tab[7][13]<<"|"<<tab[7][14]<<"|"<<tab[7][15]<<"|"<<tab[7][16]<<"|"<<tab[7][17]<<"|"<<tab[7][18]<<"|"<<tab[7][19]<<"|"<<endl;
	cout << "                     "<<"8|"<<tab[8][0]<<"|"<<tab[8][1]<<"|"<<tab[8][2]<<"|"<<tab[8][3]<<"|"<<tab[8][4]<<"|"<<tab[8][5]<<"|"<<tab[8][6]<<"|"<<tab[8][7]<<"|"<<tab[8][8]<<"|"<<tab[8][9]<<"|"<<tab[8][10]<<"|"<<tab[8][11]<<"|"<<tab[8][12]<<"|"<<tab[8][13]<<"|"<<tab[8][14]<<"|"<<tab[8][15]<<"|"<<tab[8][16]<<"|"<<tab[8][17]<<"|"<<tab[8][18]<<"|"<<tab[8][19]<<"|"<<endl;
	cout << "                     "<<"9|"<<tab[9][0]<<"|"<<tab[9][1]<<"|"<<tab[9][2]<<"|"<<tab[9][3]<<"|"<<tab[9][4]<<"|"<<tab[9][5]<<"|"<<tab[9][6]<<"|"<<tab[9][7]<<"|"<<tab[9][8]<<"|"<<tab[9][9]<<"|"<<tab[9][10]<<"|"<<tab[9][11]<<"|"<<tab[9][12]<<"|"<<tab[9][13]<<"|"<<tab[9][14]<<"|"<<tab[9][15]<<"|"<<tab[9][16]<<"|"<<tab[9][17]<<"|"<<tab[9][18]<<"|"<<tab[9][19]<<"|"<<endl;
	cout << endl << endl;
}

void domyslnie()
{
	for (int i=0;i<=10;i++)
		for (int j=0;j<=19;j++)
			tab[i][j]='-';
}

void gra(int &numer)
{
	plansza();
	string napis;
	do
	{
		if (numer%2!=0){
			cout << "Gracz 1: ";
			cin >> napis;
			int a = napis[1]-48;
			int b = napis[0]-97;
			if (tab[a][b]==x or tab[a][b]==o)
			{
				cout << "Pole zajete" << endl;
				system("PAUSE");
				system("CLS");
				plansza();
				--numer;
			}
			else
		    {
				tab[a][b] = x;
				system("CLS");
				plansza();
			}
			numer++;
			lewo1(a,b,w1);
			prawo1(a,b,w2);
			gora1(a,b,w3);
			dol1(a,b,w4);
			w1_w3(w1,w3,a);
			w3_w2(w3,w2,b);
			w2_w4(w2,w4,a);
			w4_w1(w4,w1,b);
			zwyciestwo(buf);

		}
		if (numer%2!=1){
			cout << "Gracz 2: ";
			cin >> napis;
			int a = napis[1]-48;
			int b = napis[0]-97;
			if (tab[a][b]==x or tab[a][b]==o)
			{
				cout << "Pole zajete" << endl;
				system("PAUSE");
				system("CLS");
				plansza();
				--numer;
			}
			else
		    {
				tab[a][b] = o;
				system("CLS");
				plansza();
			}
			numer++;
		}
	}
	while(true);
}

void lewo1(int a, int b, int &w1)
{
	for (int i=1;i<b;i++){
		if (tab[b-i][a]==o){
			w1=b-i;
		}
	}
}

void prawo1(int a, int b, int &w2)
{
	for (int i=1;i<b;i++){
		if (tab[b+i][a]==o){
			w2=b+i;
		}
	}
}

void gora1(int a, int b, int &w3)
{
	for (int i=1;i<a;i++){
		if (tab[b][a-i]==o){
			w3=a-i;
		}
	}
}

void dol1(int a, int b, int &w4)
{
	for (int i=1;i<a;i++){
		if (tab[b][a+i]==o){
			w4=a+i;
		}
	}
}

void w1_w3(int w1, int w3, int a)
{
	int ww=0;
	for (int i=1;i<(a-w3);i++){
		if (tab[w1+i][a-i]==o)
			ww = ww+1;
		}
	if (ww=(a-w3))
		buf = buf + 1;
	ww=0;
}

void w3_w2(int w3, int w2, int b)
{
	int ww=0;
	for (int i=1;i<(w2-b);i++){
		if (tab[b+i][w3+i]==o)
			ww = ww+1;
		}
	if (ww=(w2-b))
		buf = buf + 1;
	ww=0;
}

void w2_w4(int w2, int w4, int a)
{
	int ww=0;
	for (int i=1;i<(w4-a);i++){
		if (tab[w2-1][a+1]==o)
			ww = ww+1;
		}
	if (ww=(w4-a))
		buf = buf + 1;
	ww=0;
}

void w4_w1(int w4, int w1, int b)
{
	int ww=0;
	for (int i=1;i<(b-w1);i++){
		if (tab[b-1][w4-1]==o)
			ww = ww+1;
		}
	if (ww=(b-w1))
		buf = buf + 1;
	ww=0;
}

void zwyciestwo (int buf)
{
	if (buf=4)
		cout << "WYGRALES";
	else
	buf=0;
}

Witam

Pisze projekt na studia w którym każdy z graczy po podaniu współrzędnych np. a1 wpisuje na plansze swój znak (x lub o). Program nie jest jeszcze kompletny, lecz w obecnej formie powinien pokazać, gdy gracz 2 zwycięży. Niestety po uruchomieniu i wpisaniu jakiejś współrzędnej program przestaje działać, nie mam pojęcia gdzie się pomyliłem. Mógłby ktoś rzucić na to okiem i podpowiedzieć? Z góry dziękuję :)

komentarz 1 grudnia 2016 przez JAKUBW Nałogowiec (33,470 p.)
Ja bym stawiał na globalne zmienne.
komentarz 1 grudnia 2016 przez kostiw Nowicjusz (170 p.)
Jak mogę to naprawić? Problem musi leżeć w w1-w4 lub buf, bo te zmienne zostały dodane niedawno, po czym program zaczął się wysypywać.
komentarz 1 grudnia 2016 przez Pajdas Mądrala (5,930 p.)
Za co odpowiadają int-y w1,w2,w3,w4;
No i kiedy ich wartość jest określana

To są te wartości które ostatnio dodałeś i nie działa czy mówisz może o funkcjach o podobnej nazwie
1
komentarz 1 grudnia 2016 przez kostiw Nowicjusz (170 p.)
To jest taki mój tok rozumowania. Po wstawieniu znaku program ma szukać znaku przeciwnika wpierw w lewo, jeśli go znajdzie określa w1 jako kolumnę planszy, potem w prawo, gdy znajdzie znak przeciwnika określa w2 znowu jako kolumnę. w3 i w4 są określone przez wiersz planszy. Są to jakby wierzchołki rombu, jeśli po skosie po znakach przeciwnika dojdę od w1-w3, w3-w2. w2-w4 i w4-1 wówczas przeciwnik wygrywa.
komentarz 1 grudnia 2016 przez Wiciorny Ekspert (270,190 p.)
a zwalniasz pamieć bufora? Generalnie jeśli wypełniasz bufor a potem olewasz posprzątanie, to zostają Ci tam śmieci ....

potemczytane są te śmieci a nie oczekiwane wartości i program się gubi
komentarz 2 grudnia 2016 przez fikumiku Początkujący (360 p.)
Zgodzę się
komentarz 2 grudnia 2016 przez kostiw Nowicjusz (170 p.)
Dodałem zerowanie bufora, dalej nic ;/
komentarz 3 grudnia 2016 przez niezalogowany
Czemu nie podepniesz debuggera? Wtedy w momencie wystąpienia błędu będziesz mniej więcej wiedział która linia jest za to odpowiedzialna

5 odpowiedzi

+1 głos
odpowiedź 1 grudnia 2016 przez Pajdas Mądrala (5,930 p.)

Zmień na pewno funkcję plansza()

void plansza()
{
    cout<<"\n\n\n\n\n\n";
    cout<<"            __________________________________________" << endl;
    cout<<"            X|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|" << endl;
    for(int l=0; l<9; l++)
    {
        cout<<"            "<<l<<"|";
        for(int i=0; i<20; i++)
        {
            cout<<tab[l][i]<<"|";
        }cout<<endl;
    }
}


komentarz 1 grudnia 2016 przez kostiw Nowicjusz (170 p.)
Racja, nie wygląda to najlepiej lecz raczej nie w tym problem. Wszystko posypało się po dodaniu tych funkcji typu lewo, prawo w1 itd. Praca na poniedziałek, lecz  na weekend do zrobienia mnóstwo rzeczy, bardzo bym chciał skończyć to dziś ew. jutro.
komentarz 1 grudnia 2016 przez Pajdas Mądrala (5,930 p.)
Będę się starał ci pomóc, może przeniesiemy ewentualne problemy na prywatną rozmowę...
Dzisiaj poszukaj błędu, jeżeli chcesz to mogę tez pomóc ci z lekkim uporządkowaniem kodu, nie jestem specjalistą ale trochę już wiem jak to ma wyglądać.

Ja na dziś to zostawię bo mam też swoje zadania do wykonania, ale jutro na pewno pomogę :)
komentarz 1 grudnia 2016 przez kostiw Nowicjusz (170 p.)
Oczywiście, bardzo dziękuję za zaangażowanie :)
komentarz 2 grudnia 2016 przez Pajdas Mądrala (5,930 p.)
edycja 2 grudnia 2016 przez Pajdas

Przerobiłem ci trochę ten program
Stworzyłem funkcję kolizje(), która sprawdza czy wróg nie znajduje się z góry, z dołu, z lewej lub z prawej.

Jak coś nie będziecie rozumieć to napiszcie.

Nie dałem tego jako oddzielna odpowiedz, bo czekam na opinie, czy dokładnie o to ci chodziło.

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

string napis;
char tab[10][20];
void plansza();
void gra();
void domyslnie();
void zwyciestwo();
void kolizja(int a, int b, char wrog);

bool player1 = true;
char x = 'x';
char o = 'o';

int main()
{
    domyslnie();
    gra();
}

void plansza()
{
    cout<<"\n\n\n\n\n\n\n\n\n\n";
    cout<<"            __________________________________________" << endl;
    cout<<"            X|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|" << endl;
    for(int l=0; l<9; l++)
    {cout<<"            "<<l<<"|";
        for(int i=0; i<20; i++)
        {
            cout<<tab[l][i]<<"|";
        }cout<<endl;
    }
}


void domyslnie()
{
    for (int i=0;i<=10;i++)
        for (int j=0;j<=19;j++)
            tab[i][j]='-';
}

void gra()
{
    plansza();
    string napis;
    while(true)
    {

        if (player1 == true)
        {
            cout << "Gracz 1: ";
            cin >> napis;
            int a = napis[1]-48;
            int b = napis[0]-97;

            if (tab[a][b]!='-')    
            {
                cout << "Pole zajete" << endl;
                system("PAUSE");
                system("CLS");
                plansza();
            }
            else                                        
            {
                tab[a][b] = x;
                system("CLS");
                plansza();
                player1 = false;
                kolizja(a,b,o);
            }


        }

        if (player1 == false){
            cout << "Gracz 2: ";
            cin >> napis;
            int a = napis[1]-48;
            int b = napis[0]-97;
            if (tab[a][b]!='-')
            {
                cout << "Pole zajete" << endl;
                system("PAUSE");
                system("CLS");
                plansza();
            }
            else
            {
                tab[a][b] = o;
                system("CLS");
                plansza();
                player1 = true;
                kolizja(a,b,x);
            }

        }
    }


}

void kolizja(int a, int b, char wrog)
{
    int punkty = 0;                     ///Jeżeli punkty beda wynosić 4 to znaczy że obiekt jest 'otoczony' przez przeciwnika

        ///sprawdzenie kolizji z gora
    if(a==0 ||                          ///czy znak nie przlega do 'sufitu'
       tab[a-1][b]==wrog)               ///czy znak nie jest nie szkdliwy tz. jest tego samego znaku co aktualnie dodany
    {punkty++;}

        ///sprawdzenie kolizji z dolem
    if(a==8 || tab[a+1][b]==wrog)
    {punkty++;}

        ///sprawdzenie kolizji w lewo
    if(b==0 || tab[a][b-1]==wrog)
    {punkty++;}

        ///sprawdzenie kolizji w prawo
    if(b==19 || tab[a][b+1]==wrog)
    {punkty++;}

        ///sprawdzenie punktów
    if(punkty == 4)
    {
        zwyciestwo();
    }
}

void zwyciestwo ()
{
    cout << "WYGRALES";
}

edit: funkcja kolizje() sprawdza czy gracz się nie 'samookaleczył' dając swój "pionek" pomiędzy cztery przeciwnika...

Takie coś ma na celu sprawdzenie z której strony jest przeciwnik i wywołanie samej siebie (rekurencji funkcji) w osobie przeciwnika. Mam nadzieje że rozumiesz co właśnie napisałem smiley, aktualnie nad tym programem pracuję, jeszcze dziś postaram ci się wysłać kompletny kod który będzie spełniać swoje zadanie całkowicie

 

komentarz 3 grudnia 2016 przez kostiw Nowicjusz (170 p.)
Wow, dziękuję bardzo :D Dokładnie przestudiuje to co Pan napisał :)
+1 głos
odpowiedź 3 grudnia 2016 przez Pajdas Mądrala (5,930 p.)

Ostateczna, mam nadzieję odpowiedź.
Proszę o poszukiwanie buga
i tak, wiem, że przeszukiwanie całej tablicy nie jest zbyt ekonomiczne, ale wszystko działa i nie wywala,
przynajmniej u mnie :)

Wklejam kod:

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

string napis;
char tab[10][20];
void plansza();
void gra();
void domyslnie();
void zwyciestwo(char win);
void kolizja(int a, int b, char wrog);
void analiza();

bool player1 = true;
char x = 'x';
char o = 'o';

int main()
{
    domyslnie();
    gra();
}

void plansza()
{
    cout<<"\n\n\n\n\n\n\n\n\n\n";
    cout<<"            __________________________________________" << endl;
    cout<<"            X|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|" << endl;
    for(int l=0; l<9; l++)
    {cout<<"            "<<l<<"|";
        for(int i=0; i<20; i++)
        {
            cout<<tab[l][i]<<"|";
        }cout<<endl;
    }
}


void domyslnie()
{
    for (int i=0;i<=10;i++)
        for (int j=0;j<=19;j++)
            tab[i][j]='-';
}

void gra()
{
    plansza();
    string napis;
    while(true)
    {

        if (player1 == true)
        {
            cout << "Gracz 1: ";
            cin >> napis;
            int a = napis[1]-48;
            int b = napis[0]-97;

            if (tab[a][b]!='-')
            {
                cout << "Pole zajete" << endl;
                system("PAUSE");
                system("CLS");
                plansza();
            }
            else
            {
                tab[a][b] = x;
                system("CLS");
                plansza();
                player1 = false;
                analiza();
            }


        }

        if (player1 == false){
            cout << "Gracz 2: ";
            cin >> napis;
            int a = napis[1]-48;
            int b = napis[0]-97;
            if (tab[a][b]!='-')
            {
                cout << "Pole zajete" << endl;
                system("PAUSE");
                system("CLS");
                plansza();
            }
            else
            {
                tab[a][b] = o;
                system("CLS");
                plansza();
                player1 = true;
                analiza();
            }

        }
    }
}

void analiza()
{
    for(int i=0; i<9; i++)
    {
        for(int l=0; l<19; l++)
        {
            if(tab[i][l]==x)
            {
                kolizja(i,l,o);
            }
            else if(tab[i][l]==o)
            {
                kolizja(i,l,x);
            }
        }
    }
}

void kolizja(int a, int b, char wrog)
{
    int punkty = 0;

        ///sprawdzenie kolizji z gora
    if(a==0 || tab[a-1][b]==wrog)
    {punkty++;}

        ///sprawdzenie kolizji z dolem
    if(a==8 || tab[a+1][b]==wrog)
    {punkty++;}

        ///sprawdzenie kolizji w lewo
    if(b==0 || tab[a][b-1]==wrog)
    {punkty++;}

        ///sprawdzenie kolizji w prawo
    if(b==19 || tab[a][b+1]==wrog)
    {punkty++;}

        ///sprawdzenie punktów
    if(punkty == 4)
    {
        zwyciestwo(wrog);
    }
}

void zwyciestwo (char win)
{
    cout << "Zwyciesca: "<<win<<endl<<endl;
    system("PAUSE");
}

Mam nadzieję, że pomogłem, postaram się jeszcze trochę zmodyfikować ten kod aby był bardziej wydajny.
Proszę o ocenę odpowiedzi i sugestie oraz zachęcam do zadawania pytań

1
komentarz 3 grudnia 2016 przez kostiw Nowicjusz (170 p.)
Program działa bardzo dobrze, naprawdę bardzo dziękuję za pomoc :)
0 głosów
odpowiedź 1 grudnia 2016 przez Wiciorny Ekspert (270,190 p.)

Z kolei mam pytanie: dlaczego... w If- zamiast stawiać warunku, przypisujesz? 

    if (ww=(w2-b))

Poniżej lub powyżej analogicznie to samo zrobiłeś.. 
tu nie badasz warunku tylko przypisujesz wartosc 
komentarz 1 grudnia 2016 przez kostiw Nowicjusz (170 p.)
Faktycznie głupio, pozmieniałem tak żeby badany był warunek, program dalej się wysypuje.
komentarz 1 grudnia 2016 przez Wiciorny Ekspert (270,190 p.)
dziwne skopiowałem twój kod... i u mnie działa tzn... nie wysypuje się ;] zwraca mi kiedy gracz wygrywa i kiedy pole jest zajęte ... Natomiast- w programie np Dev c++ sie wysypuje.

Problem jest z pamięcią - jutro bede mial wiecej czasu to spróbuje sie pobawic

wyczyść bufor
komentarz 1 grudnia 2016 przez Wiciorny Ekspert (270,190 p.)
Więc tak pobawiłem się i zdebugowałem problem

The error code 3221225477 is 0xC0000005 in hex, which on Windows is:

-- to jest kod błędu oznacza to :

#define STATUS_ACCESS_VIOLATION ((NTSTATUS)0xC0000005L)

Access violation is Windows' version of "segmentation fault", which simply said means that the program tried to access a memory which is not allocated. This can happen for a lot of different reasons, but mostly (if not always) is a bug in the program.

W skrócie alokujesz miejsce w pamięci na dane którego nie ma - i nie masz dostępu. NP odwołujemy sie do elemntu w tablicy, wskaźnikiem ale tego miejsca nie ma. Albo iterujemy  tablice po komórkach których nie ma ;] wskazówka- że tu musisz szukać błędu
0 głosów
odpowiedź 3 grudnia 2016 przez niezalogowany

Problem leży w linii 79, specjalnie dla Ciebie zrzut z debuggera:


shead@skyline /tmp $ g++ t.cpp -g
shead@skyline /tmp $ gdb -q ./a.out
Reading symbols from ./a.out...done.
gdb-peda$ r
Starting program: /tmp/a.out
 
 
 
 
 
                       _______________________________________
                      |a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|
                     0|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
                     1|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
                     2|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
                     3|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
                     4|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
                     5|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
                     6|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
                     7|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
                     8|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
                     9|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|
 
 
Gracz 1: 1
 
Program received signal SIGSEGV, Segmentation fault.
 
 [----------------------------------registers-----------------------------------]
RAX: 0x603f30 --> 0x4008f0 --> 0x604018 --> 0x7ffff7af27e0 (<_ZNSt8ios_base4InitC2Ev>:  push   r15)
RBX: 0x0
RCX: 0x78 ('x')
RDX: 0xffffffffffffffd0
RSI: 0xffffffffffffffd0
RDI: 0x7fffffffe3c0 --> 0x7fffffffe3d0 --> 0x31 ('1')
RBP: 0x7fffffffe400 --> 0x7fffffffe410 --> 0x4034e0 (<__libc_csu_init>: push   r15)
RSP: 0x7fffffffe3a0 --> 0x603de8 --> 0x400c60 (<frame_dummy>:   mov    edi,0x603e00)
RIP: 0x402dd9 (<gra(int&)+362>: mov    BYTE PTR [rax],cl)
R8 : 0x7ffff78398e0 --> 0xfbad2288
R9 : 0x7ffff783b790 --> 0x0
R10: 0xd57 ('W\r')
R11: 0x7ffff7b74990 (<_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEixEm>:       mov    rax,rsi)
R12: 0x400b90 (<_start>:        xor    ebp,ebp)
R13: 0x7fffffffe4f0 --> 0x1
R14: 0x0
R15: 0x0
EFLAGS: 0x10207 (CARRY PARITY adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x402dcc <gra(int&)+349>:    shl    rax,0x2
   0x402dd0 <gra(int&)+353>:    add    rax,rsi
   0x402dd3 <gra(int&)+356>:    add    rax,0x604320
=> 0x402dd9 <gra(int&)+362>:    mov    BYTE PTR [rax],cl
   0x402ddb <gra(int&)+364>:    mov    edi,0x403617
   0x402de0 <gra(int&)+369>:    call   0x400ab0 <system@plt>
   0x402de5 <gra(int&)+374>:    call   0x400ca0 <plansza()>
   0x402dea <gra(int&)+379>:    mov    rax,QWORD PTR [rbp-0x58]
[------------------------------------stack-------------------------------------]
0000| 0x7fffffffe3a0 --> 0x603de8 --> 0x400c60 (<frame_dummy>:  mov    edi,0x603e00)
0008| 0x7fffffffe3a8 --> 0x6040a0 --> 0x6f7800000001
0016| 0x7fffffffe3b0 --> 0x0
0024| 0x7fffffffe3b8 --> 0xffffffd0ffffffd0
0032| 0x7fffffffe3c0 --> 0x7fffffffe3d0 --> 0x31 ('1')
0040| 0x7fffffffe3c8 --> 0x1
0048| 0x7fffffffe3d0 --> 0x31 ('1')
0056| 0x7fffffffe3d8 --> 0x40352d (<__libc_csu_init+77>:        add    rbx,0x1)
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x0000000000402dd9 in gra (numer=@0x6040a0: 0x1) at t.cpp:79
79                      tab[a][b] = x;
gdb-peda$ list
74                      plansza();
75                      --numer;
76                  }
77                  else
78                  {
79                      tab[a][b] = x;
80                      system("CLS");
81                      plansza();
82                  }
83                  numer++;

Problem leży w tym, że próbujesz przypisać wartość do nieprawidłowego miejsca w pamięci (tak w skrócie), czyli wartość zmiennej a lub zmiennej b jest nieprawidłowa

–1 głos
odpowiedź 1 grudnia 2016 przez Wiciorny Ekspert (270,190 p.)
przywrócone 3 grudnia 2016

a może tu : 

 while(true); // może tutaj 

Kiedy warunek jest false? :) - pentla możliwie się zawiesza 

komentarz 1 grudnia 2016 przez kostiw Nowicjusz (170 p.)
To raczej nie to, gdy nie było funkcji gora,dol,prawo,lewo w... itd program działał. Zaczął się wysypywać po dodaniu tych własnie funkcji, nie mogę niestety znaleźć przyczyny ;/
komentarz 1 grudnia 2016 przez Pajdas Mądrala (5,930 p.)
Po pierwsze, najlepiej zacznij pisać to od nowa tylko obiektowo..........
komentarz 1 grudnia 2016 przez kostiw Nowicjusz (170 p.)
Nie da się ukryć, że jestem początkującym. Termin oddania gry coraz bliżej a do zrobienia masa innych rzeczy, chciałem dziś to skończyć. Pisanie od nowa średnio mi się widzi ;/
1
komentarz 1 grudnia 2016 przez jpacanowski VIP (101,940 p.)

pętla

komentarz 3 grudnia 2016 przez niezalogowany

Nieskończona pętla to nie problem, można z niej wyjść np przez użycie break

komentarz 3 grudnia 2016 przez Pajdas Mądrala (5,930 p.)
Poza tym można przerwać działanie programu w nieskończonej pętli, nawet bez tego break;.

Podobne pytania

0 głosów
1 odpowiedź 262 wizyt
pytanie zadane 5 grudnia 2016 w C i C++ przez varespol Użytkownik (710 p.)
0 głosów
2 odpowiedzi 371 wizyt
0 głosów
2 odpowiedzi 405 wizyt
pytanie zadane 25 października 2017 w C i C++ przez cylo24 Początkujący (300 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...