Plansza w postaci tablicy dwuwymiarowej z obiektami innej klasy.

0

Witam,
podczas tworzenia gry w statki pojawił mi sie mały problem i nie moge dojść do powodu jego wystąpienia. Podaje fragmenty kodu, może ktoś mi podpowie dlaczego program sie wywala:
Klasa pole

 class Pole
{
	char X;		//wspołrzędna X
	char Y;		//wspołrzędna Y
	int status = 0;	//przypisany status
	enum flaga
	{	wolne = 1,	zaznaczone = 2,  trafione= 3  };		//flaga pola
	char znak;  // znak pola

public:
	Pole();
	Pole(const char, const char );
        void Ustaw_Staus(int);
         int Zwroc_Zaznaczone();

Klasa plansza

#include "Pole.h"


class Plansza
{
	Pole plansza[9][9];

public:
	Plansza();
	~Plansza();
	void Wyswietl_Plansze();
	void Ustaw_Pole(const char, const char);
        int Zwroc_Zaznaczone(const char, const char);
}; 

*Konsturktor i potrzebne metody do klasy pole *

Pole::Pole()
{
	this->X = NULL;
	this->Y = NULL;
	this->status = wolne;
	Ustaw_Znak();
}
Pole::Pole(const char x, const char y)
{
	this->X = x;
	this->Y = y;
	this->status = wolne;
	Ustaw_Znak();
} 
void Pole::Ustaw_Staus(int a)
{
	this->status = a;
}
int Pole::Zwroc_Zaznaczone()
{
	return this->zaznaczone;
}

I metody klasy plansza

 Plansza::Plansza() 
{
	for (char i = 0; i < 9; ++i)
	{
		for (char j = 0; j < 9; ++j)
		{
			plansza[i][j];
			plansza[i][j].Pole::Pole(i, j);
		}
	}
}
void Plansza::Ustaw_Pole(const char x, const char y)
{
	plansza[x][y].Ustaw_Staus(2);  //podaje wartosc do funkcji na sztywno na potrzeby testow
}
int Plansza::Zwroc_Zaznaczone(const char x, const char y)
{
	return plansza[x][y].Pole::Zwroc_Zaznaczone();
	
}

Na koniec klasa statek

 
class Statki
{
	Plansza okrety;
public:
	Statki();
        void Ustaw_Polozenie(const char, const char);
        void Jedno_Masztowiec(const char, const char);


void Statki::Jedno_Masztowiec(const char x, const char y)
{
	Ustaw_Polozenie(x, y);
}

void Statki::Ustaw_Polozenie(const char x, const char y)
{
	okrety.Ustaw_Pole(x, y, okrety.Zwroc_Zaznaczone(x,y));
}

Na początek pytanie czy takie tworzenie planszy jest rozsądne, może ktoś ma lepszy pomysł?
A problem który mam polega na tym że podczas wykonywania metody Ustaw_Polozenie wywołuje sie , metoda Ustaw_Pole a w niej finalnie
zmieniam wartość pola "status" w klasie Pole. I właśnie podczas zmiany tego statusu przez funkcje Ustaw_Status(...) wywala mi błąd:
Unhandled exception at in statki.exe: Access violation writing location...
Ma ktoś jakieś sugestie, co robie źle?

Pozdrawiam

0

Pierwsze co zrobiłem to użyłem Google ;p.

i cały czas nie wiem gdzie jest błąd.

this->status = a; 

w tej linijce sie wysypuje, natomiast wartość a jest przekazywana do funkcji wiec nie wiem dlaczego tak sie dzieje.

0

Masz trzy możliwości:

  1. Odpalasz debuger i sprawdzasz.
  2. Wklejasz pełny kod.
  3. Zgłaszasz się na forum wróżbitów.
0

Przez debbugera szukałem, ale po prostu nie moge zrozumieć co jest źle.
Poniżej cały kod:


#pragma once
class Pole
{
	char X;		//wspołrzędna X
	char Y;		//wspołrzędna Y
	int status = 0;	//przypisany status
	enum flaga
	{	wolne = 1,	zaznaczone = 2,  trafione= 3  };		//flaga pola
	char znak;  // znak pola

public:
	Pole();
	Pole(const char, const char );
	~Pole();
	void Wprowadz_Pole(const char,const char);
	bool Sprawdz_Wolne(char, char) const;
	int Sprawdz_Status(const char, const char);
	void Ustaw_Staus(int);
	void Ustaw_Znak();
	void Pokaz_Znak();
	int Zwroc_Zaznaczone();
};


#include "Pole.h"
#include <iostream>

using namespace std;


Pole::Pole()
{
	this->X = NULL;
	this->Y = NULL;
	this->status = wolne;
	Ustaw_Znak();
}
Pole::Pole(const char x, const char y)
{
	this->X = x;
	this->Y = y;
	this->status = wolne;
	Ustaw_Znak();

}


Pole::~Pole()
{
}

void Pole::Wprowadz_Pole(const char x, const char y)
{
	this->X = x;
	this->Y = y;
}
int Pole::Sprawdz_Status(const char x, const char y)
{

	for (int i = 0; i < 9; ++i)	//duza pętla po X
	{
		if (this->X == x)
		{
			for (int j = 0; j < 9; ++j)
			{
				if (this->Y == y)
					return this->status;
			}
		}
	}
}

void Pole::Ustaw_Staus(int a)
{
	this->status = a;
}
void Pole::Ustaw_Znak()
{
	if (this->status == trafione)
		this->znak = 'T';
	else if (this->status == zaznaczone)
		this->znak = 'X ';
	else
		this->znak = 'W';

}
void Pole::Pokaz_Znak()
{
	cout << this->znak;
}
int Pole::Zwroc_Zaznaczone()
{
	return this->zaznaczone;
}



//PLANSZA
#pragma once
#include "Pole.h"


class Plansza
{
	Pole plansza[9][9];

public:
	Plansza();
	~Plansza();
	void Wyswietl_Plansze();
	void Ustaw_Pole(const char, const char, int);
	int Zwroc_Zaznaczone(const char, const char);
};

#include "Plansza.h"
#include <iostream>

using namespace std;

Plansza::Plansza() 
{
	for (char i = 0; i < 9; ++i)
	{
		for (char j = 0; j < 9; ++j)
		{
			plansza[i][j];
			plansza[i][j].Pole::Pole(i, j);
		}
	}
}


Plansza::~Plansza()
{
}

void Plansza::Wyswietl_Plansze()
{
	for (int i = 0; i <= 9; ++i)
	{
	
		for (int j = 0; j <= 9; ++j)
		{
			
			cout <<"|"<< " "<<"|";
			plansza[i][j];
			plansza[i][j].Pokaz_Znak();
		}
		cout << endl << endl;;
	}
		

}
void Plansza::Ustaw_Pole(const char x, const char y, int a)
{
	plansza[x][y].Ustaw_Staus(2);
}
int Plansza::Zwroc_Zaznaczone(const char x, const char y)
{
	return plansza[x][y].Pole::Zwroc_Zaznaczone();
	
}



//STATKI
#pragma once
#include "Plansza.h"
class Statki
{
	Plansza okrety;
public:
	Statki();
	~Statki();
	void Jedno_Masztowiec(const char, const char);
	void Dwu_Masztowiec();
	void Trzy_Masztowiec();
	void Ustaw_Polozenie(const char, const char);
};

#include "Statki.h"


Statki::Statki()
{
}


Statki::~Statki()
{
}
void Statki::Jedno_Masztowiec(const char x, const char y)
{
	Ustaw_Polozenie(x, y);
}

void Statki::Ustaw_Polozenie(const char x, const char y)
{
	okrety.Ustaw_Pole(x, y, okrety.Zwroc_Zaznaczone(x,y));
} 
0
  1. Zacznij od przeczytania jakichś podstaw.
  2. W tym kodzie: this->status = a; nie ma błędu, jest w innym miejscu które nie pokazałeś.
  3. Podany kod nawet się nie kompiluje, kompilator wskazuje ci błędy, ty ich ignorujesz, odpalasz stare EXE, więc nawet nie wiesz gdzie jest błąd.
  4. Pozbądź się ostrzeżeń bo indeksacja tablicy za pomocą char niczego nie przyspieszy, wręcz spowolni.
  5. http://ideone.com/1X39zo
0

W tym kodzie: this->status = a; nie ma błędu, jest w innym miejscu które nie pokazałeś.

Podczas analizowania kodu w debuggerze zauważyłem ze gdy uruchamiam metode s.Ustaw_Polozenie(0,0); wszystko wykonuje sie zgodnie z zamierzeniem, lecz gdy wywołuje najpierw metode s.Jedno_Masztowiec(x, y); to w polu status na początku są jakieś śmieci, stąd wniosek, że konstruktor nie zadziałał poprawnie i dlatego kompilator wywala błąd. Mam racje ?

0

Chrzani waść: http://ideone.com/6xojFs

stysiu20 napisał(a):

... stąd wniosek, że konstruktor nie zadziałał poprawnie i dlatego kompilator wywala błąd. Mam racje ?
Nie, stąd wniosek że kompilujesz nie to co uruchamiasz i debugujesz.
Podany kod nie da się skompilować, co tam się dzieje nikt nie wie.

0

W takim razie gdzie jest błąd ze kod się nie skompiluje? Twoje podpowiedzi niewiele mi mówią..

0

To czytaj komunikaty kompilatora lub komentarze w kodzie na ideone

0

kompilator mi błędów nie wywala (przebudowałem projekt). Co do komentarzów to poprawiłem zgodnie z twoimi sugestiami.
Cały czas mam wątpliwości do konstruktora klasy Plansza, czy on robi to co powinien.

0

Zależy w jakiej postaci.

0

W takiej jak poprawiłeś.

1

Jeżeli nadal nie działa to podaj pełny kod, taki aby można było wrzucić do kompilatora i zobaczyć o czym mówisz.
Wywal składową znak oraz metody: Ustaw_Znak(), Pokaz_Znak()
Zamiast nich: char Pole::Zwroc_Znak() { return "WXT"[status]; }
Usuń też niepotrzebne this->

0

Na ten moment przejrzałem jeszcze raz kod i zadziałało tak jak powinno. Dziękuje za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1