Reklama
Strona 1 z 2 12 OstatniaOstatnia
Pokazuje wyniki od 1 do 15 z 20

Temat: [C++] Problem z grą - Exception thrown: read access violation

  1. #1
    Avatar Dio Paladin
    Data rejestracji
    2007
    Wiek
    28
    Posty
    959
    Siła reputacji
    17

    Domyślny [C++] Problem z grą - Exception thrown: read access violation

    Główna funkcja odpowiedzialna za prowadzenie gry:
    Kod:
    void Oczko::graj()
    {
    	bool koniecGry = false;
    	// status gracza [ 0 = Gra, 1 = Zrezygnował, 2 - Zdyskwalifikowany ]
    	int status[8] = { 0 };
            int wartosci = 0, najlepszyGracz = -1;
    	this->talia = new Talia();
    	this->talia->tasuj();
    
            while(true)
            {
    	        for(int i = 0; i < this->iloscGraczy; i++)
    		{
    			if (tablicaGraczy[i]->policzPunkty() > 21)
    			{
    				cout << "Gracz " << tablicaGraczy[i]->dajImie() << " zostal wyeliminowany z gry" << endl;
    			}
    			else if (tablicaGraczy[i]->czyNastepna() == true)
    			{
    				Karta* karta = this->talia->dajKarte();
    				tablicaGraczy[i]->dodajKarte(karta);
    				
    				cout << "Gracz " << tablicaGraczy[i]->dajImie() << " wylosowal karte \"" << karta->dajAwers() + "\"" << endl;
    
    				if (tablicaGraczy[i]->policzPunkty() == 21)
    				{
    					cout << "#############################################################" << endl;
    					cout << "Gracz " << tablicaGraczy[i]->dajImie() << " wygral te rozrywke zdobywajac 21 punktow!!" << endl;
    					cout << "#############################################################" << endl;
                        tablicaGraczy[i]->nowaGra();
                        return;
    				}
    				else if (tablicaGraczy[i]->policzPunkty() > 21) status[i] = 2;
    			}
    			else
    			{
    				cout << "Gracz " << tablicaGraczy[i]->dajImie() << " zrezygnowal z pobierania kart" << endl;
    				status[i] = 1;
    			}
    
    			cout << "Obecna ilosc punktow tego gracza to: " << tablicaGraczy[i]->policzPunkty() << endl;
    			cout << "----------------------" << endl;
    
    			// sprawdzanie ostatecznych poczyniań graczy w tej rundzie
    			koniecGry = true;
    			for(int u = 0; u < this->iloscGraczy; u++)
    			{
    				if (status[u] == 0) 
    				{
    					koniecGry = false; 
    					break;
    				}
    			}
    
    			if (koniecGry)
    			{
    				for(int u = 0; u < this->iloscGraczy; u++)
    				{
    					if (status[u] == 2) continue;
                        else if (najlepszyGracz == -1) najlepszyGracz = u;
    					else if (tablicaGraczy[u]->policzPunkty() > tablicaGraczy[najlepszyGracz]->policzPunkty()) 
    						najlepszyGracz = u;
    				}
    
    				cout << "#############################################################" << endl;
    				cout << "Gracz " << tablicaGraczy[najlepszyGracz]->dajImie() << " wygral te rozrywke zdobywajac " << tablicaGraczy[najlepszyGracz]->policzPunkty() << " punktow!!" << endl;
    				cout << "#############################################################" << endl;
    				tablicaGraczy[najlepszyGracz]->nowaGra();
                                    return;
    
    
                             }
    		}
    	}
     }
    Klasa gracz:
    Kod:
    #include "gracz.h"
    
    Gracz::Gracz()
    {
        this->ileKart = 0;
    }
    
    Gracz::~Gracz()
    {
    
    }
    
    void Gracz::ustawImie(string imie)
    {
    	this->imie = imie;
    }
    
    string Gracz::dajImie()
    {
    	return this->imie;
    }
    
    void Gracz::dodajKarte(Karta *k)
    {
        this->reka[ileKart] = k;
        this->ileKart++;
    }
    
    int Gracz::policzPunkty()
    {
    	int wszystkiePunkty = 0;
    	for (int i = 0; i < ileKart; i++)
    		wszystkiePunkty += this->reka[i]->wartoscOczko();
    	return wszystkiePunkty;
    }
    
    void Gracz::wyswietlKarty()
    {
    	for (int i = 0; i < ileKart; i++)
    		cout << this->reka[i]->dajAwers() << endl;
    }
    Nagłówek klasy:
    Kod:
    #include <iostream>
    #include <string>
    #include "karta.h"
    
    using namespace std;
    
    class Gracz
    {
    public:
        Gracz();
        ~Gracz();
        virtual void nowaGra() = 0;
        void ustawImie(string imie);
        string dajImie();
        void dodajKarte(Karta *k);
        int policzPunkty();
        void wyswietlKarty();
        virtual bool czyNastepna() = 0;
    
    protected:
        Karta *reka[10];
        int ileKart;
        string imie;
    };
    Od początku - piszę grę karcianą oczko na zaliczenie. Zasady większość chyba zna, chodzi o dobieranie kolejnych kart, gdzie każda z nich ma określoną wartość i należy w sumie mieć 21 punktów z kart na ręce. Całość programu jest napisana ale pojawia się pewien problem podczas gry. Ogólnie koniec rozgrywki można podzielić na 3 stany:

    I Wygrywam ja, gracz fizyczny
    II Wygrywa któryś z graczy komputerowych
    III Oboje przegrywamy (mamy powyżej 21 punktów) ale najlepszym graczem zostaje ta osoba, która była najbliżej 21 punktów

    Problem jest z ostatnim stanem, kiedy ja i komputer przekroczymy ilość punktów potrzebną do wygrania program się wysypuje wyrzucając mi "Exception thrown: read access violation. this was 0xCCCCCCCC." i kompilator wskazuje na pogrubioną funkcję policzPunkty w klasie gracza. Kompletnie nie wiem co jest nie tak, szukając odpowiedzi na mój problem znalazłem parę wątków na stackoverflow i głównym powodem u innych ludzi był niezainicjowany wskaźnik lub wskaźnik, który został uwolniony. Szczerze powiem, że mimo tej informacji nadal nie widzę u siebie problemu. Przesiedział bym nad tym chętnie jeszcze sam ale termin oddania wszystkich projektów mnie goni więc zwracam się o pomoc do was. Jeśli trzeba mogę podesłać wszystkie pliki źródłowe.

  2. #2
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    Miejsce gdzie może być coś nie tak w funkcji policz to gdy liczba elemetow tablicy reka i wartość zmiennej ileKart będą miały różne wartości wtedy wyjdziesz poza zakres kontenera.
    A i nie czaje dlaczego wywołujesz czysto virtualną metodę virtual void nowaGra() = 0 ; z klasy gracz która nie ma zadnej implementacji?


    @down;

    a no tak, nawet nie przeczytałem że to nie cały kod programu a jak szukałem ctrl+f to mi nie znalazło implementacji żadnej
    Ostatnio zmieniony przez Pumpkin : 21-05-2016, 10:42
    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Leki które aktualnie mają wartość 200zł, po refundacji płacimy 50 zł, a za Korwina będą kosztowały 10zł. Bardziej tak

    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    (...)bo był honorowym rycerzem w porównaniu do tego gościa, który oddał bez walki zamek.

  3. Reklama
  4. #3
    Avatar Ewande
    Data rejestracji
    2006
    Położenie
    Wrocław
    Posty
    367
    Siła reputacji
    18

    Domyślny

    Cytuj Pumpkin napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    A i nie czaje dlaczego wywołujesz czysto virtualną metodę virtual void nowaGra() = 0 ; z klasy gracz która nie ma zadnej implementacji?
    Gracz to klasa abstrakcyjna i pewnie w tablicy graczy trzyma konkretne rodzaje graczy w stylu człowiek i komputer.

    I tak jak Pumpkin mówi - sprawdź, jaka jest wartość zmiennej ileKart przed podliczeniem punktów.
    Ostatnio zmieniony przez Ewande : 21-05-2016, 10:37

  5. #4
    Avatar Dio Paladin
    Data rejestracji
    2007
    Wiek
    28
    Posty
    959
    Siła reputacji
    17

    Domyślny

    Doprowadziłem do sytuacji, gdzie oboje, ja i komputer mamy powyżej 21 punktów. Ustawiłem breakpointa zaraz przed końcowym policzeniem punktów (pierwszy cout z ###). Przed wyświetleniem najlepszego gracza, u mnie ileKart = 5, a u komputera ileKart = 3.
    Zszedłem linijkę niżej, gdzie program liczy punkty i powinien wyświetlić najlepszego gracza i wtedy połowa zmiennych wyrzuca <unable to read memory>.

  6. #5
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    A weź se dla testu zamień pola protected na public w klasie Gracz.

    irc: freenode.net in #torgdevs

  7. #6
    Avatar Dio Paladin
    Data rejestracji
    2007
    Wiek
    28
    Posty
    959
    Siła reputacji
    17

    Domyślny

    Nie pomogło, nadal program wywala się w sytuacji gdzie ja i komputer mamy więcej niż 21 punktów, a połowy zmiennych nie może odczytać - <unable to read memory>.

  8. #7
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    A na stackoverflow byles? Sporo ludzi miało ten problem i tez jest sporo rozwiązań.

    Przykład:
    http://stackoverflow.com/questions/2...to-read-memory

    irc: freenode.net in #torgdevs

  9. #8
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    daj źródła wszystkie
    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Leki które aktualnie mają wartość 200zł, po refundacji płacimy 50 zł, a za Korwina będą kosztowały 10zł. Bardziej tak

    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    (...)bo był honorowym rycerzem w porównaniu do tego gościa, który oddał bez walki zamek.

  10. #9
    Avatar Dio Paladin
    Data rejestracji
    2007
    Wiek
    28
    Posty
    959
    Siła reputacji
    17

    Domyślny

    Oczywiście, że byłem, przekopałem się przez parę tematów i w większości ludzie mieli niezainicjowany wskaźnik w kodzie. Mimo to nadal nie umiem u siebie znaleźć błędu w programie, a siedzę już nad tym dwa dni... :c

    Wszystkie źródła: <nimo>
    Ostatnio zmieniony przez Dio Paladin : 21-05-2016, 14:00

  11. #10
    Avatar Chels
    Data rejestracji
    2013
    Wiek
    30
    Posty
    2,824
    Siła reputacji
    13

    Domyślny

    zamiast tablicy wskaznikow czyli Karta *reka[10];
    zrob Karta *reka;
    i w konstruktorze klasy gracz zainicjalizuj reka = new Karta[10]

    i wtedy
    this->reka[i].WartoscOczko

    i nie zapomnij w destruktorze zwolnic pamieci czyli delete[] reka;


    jezeli chcesz zostac przy Karta* reka[10]
    musisz dla kazdego elementu tablicy alokowac pamiec czyli for (int i = 0 ; i <10 ; i++) reka[i] = new Karta;
    Ostatnio zmieniony przez Chels : 21-05-2016, 13:18

  12. #11
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    for(int u = 0; u < this->iloscGraczy; u++)
    {
    if (status[u] == 2) continue;
    else if (najlepszyGracz == -1) najlepszyGracz = u;
    else if (tablicaGraczy[u]->policzPunkty() > tablicaGraczy[najlepszyGracz]->policzPunkty())
    najlepszyGracz = u;
    }
    Dwaj gracze są zdyskwalifikowani więc
    status[0] == 2
    oraz
    status[1] == 2
    Czyli dwa razy zostanie wywołane continue a indeks najlepszyGracz nie zostanie ustawiony i dalej będzie -1. A potem probujesz tego indeksu uzyc zeby sie dostac do tablicy do elementu -1.
    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Leki które aktualnie mają wartość 200zł, po refundacji płacimy 50 zł, a za Korwina będą kosztowały 10zł. Bardziej tak

    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    (...)bo był honorowym rycerzem w porównaniu do tego gościa, który oddał bez walki zamek.

  13. #12
    Avatar Dio Paladin
    Data rejestracji
    2007
    Wiek
    28
    Posty
    959
    Siła reputacji
    17

    Domyślny

    @Chels ;
    Zrobiłem jak napisałeś ale teraz visual ma problem z:

    Kod:
    void Gracz::dodajKarte(Karta *k)
    {
        this->reka[ileKart] = k;
        this->ileKart++;
    }
    Nie pasuje mu znak "=" w pogrubionej linijce. Teraz to już sam zgłupiałem.

  14. #13
    Avatar Chels
    Data rejestracji
    2013
    Wiek
    30
    Posty
    2,824
    Siła reputacji
    13

    Domyślny

    Cytuj Dio Paladin napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    @Chels ;
    Zrobiłem jak napisałeś ale teraz visual ma problem z:

    Kod:
    void Gracz::dodajKarte(Karta *k)
    {
        this->reka[ileKart] = k;
        this->ileKart++;
    }
    Nie pasuje mu znak "=" w pogrubionej linijce. Teraz to już sam zgłupiałem.
    masz przeciazony operator = dla sie dla klasy Karta? ;p

  15. #14
    Avatar Dio Paladin
    Data rejestracji
    2007
    Wiek
    28
    Posty
    959
    Siła reputacji
    17

    Domyślny

    Kod:
    for(int u = 0; u < this->iloscGraczy; u++)
    	{
    	       if (status[u] == 2 && status[u+1] != 2) continue;
                   else if (najlepszyGracz == -1) najlepszyGracz = u;
    	       else if (tablicaGraczy[u]->policzPunkty() > tablicaGraczy[najlepszyGracz]->policzPunkty()) 
    	       najlepszyGracz = u;
    	}
    Dobra, poprawiłem pogrubioną linijkę i teraz elegancko bangla. Wprawdzie nie ma wyjątku na to kiedy dochodzi do remisu - oboje z graczy mają tyle samo punktów ale przynajmniej już się nie sypie.

    Dzięki za naprowadzenie Pumpkin, reszcie również dziękuję za pomoc, zielone zaraz wylecą.

    //Tak, wiem, muszę to jeszcze poprawić na 8 graczy, easy :d
    Ostatnio zmieniony przez Dio Paladin : 21-05-2016, 14:03

  16. #15
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    Cytuj Chels napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    masz przeciazony operator = dla sie dla klasy Karta? ;p
    typie ale on to chce na wskaźnikach zrobić a nie kopiować obiekty,
    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Leki które aktualnie mają wartość 200zł, po refundacji płacimy 50 zł, a za Korwina będą kosztowały 10zł. Bardziej tak

    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    (...)bo był honorowym rycerzem w porównaniu do tego gościa, który oddał bez walki zamek.

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Pytanie dot. rule violation.
    Przez Filia the Dragon w dziale Tibia
    Odpowiedzi: 5
    Ostatni post: 10-01-2014, 15:56
  2. Niesluszny rule violation
    Przez adikk3 w dziale Tibia
    Odpowiedzi: 1
    Ostatni post: 29-04-2013, 17:09
  3. "Disk read error occured" - problem z dyskiem
    Przez SerQ w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 1
    Ostatni post: 07-12-2012, 20:06
  4. Problem z dyskiem "Raw Read Error Rate"
    Przez M4arcin w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 4
    Ostatni post: 01-07-2012, 12:12
  5. You read: Point of no return! Potrzebna pomoc
    Przez Alex17-17 w dziale Tibia
    Odpowiedzi: 3
    Ostatni post: 30-09-2010, 18:48

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •