Klasa macierz - naruszenie ochrony pamięci

0

Witam. Przy mnożeniu 2 macierzy zmienna "wart" liczy się dobrze, ale funkcja "uzupelnij" nie wpisuje dobrze wartości(tzn. wypisując w locie już są złe), przy 5 wywołaniu dla macierzy 2x2 wyskakuje błąd ochrony pamieci.


using namespace std;

class macierz{
private:
	int **tab;
	int szer,wys;
public:
	macierz(int,int);
	macierz();
	~macierz();
	int uzupelnij(int,int,int);
	int wartosc(int,int);
	void wyswietlkkol(int);
	void wyswietlkwiersz(int);
	void dopliku(char*);
	void wyswietlall();
	void wyswietlwiersz(int);
	void wyswietlkol(int);
	macierz (char*);
	macierz operator+(macierz & m);
	macierz operator-(macierz & m);
	macierz operator*(macierz & m);
	macierz operator*(int m);
	int wysokosc();
	int szerokosc();
	void transponuj();
};


int macierz::wysokosc(){return wys;}
int macierz::szerokosc(){return szer;}

int macierz::uzupelnij(int s,int w,int wartosc){
	if(s>szer) return 0;
	if(s<=0) return 0;
	if(w>wys) return 0;
	if(w<=0) return 0;
	tab[s-1][w-1]=wartosc;
	return 1;
}

int macierz::wartosc(int s,int w){
	if(s>szer) return 0;
	if(s<=0) return 0;
	if(w>wys) return 0;
	if(w<=0) return 0;
	return tab[s-1][w-1];
}

void macierz::wyswietlall(){
	for(int i=0;i<wys;i++){
		wyswietlwiersz(i+1);
		cout << endl;
	}
}

void macierz::wyswietlwiersz(int a){
	for(int i=0;i<szer;i++) cout << tab[a-1][i] << " ";
}

macierz macierz::operator*(macierz & m){
	if(szer!=m.wys){
		macierz nowa;
		return nowa;
	}
	macierz nowa(wys,m.szer);
	int wart=0;
	for(int i=0;i<m.szer;i++){ 
		for(int j=0;j<wys;j++){
			wart=0;
			for(int x=0;x<m.wys;x++){
				wart+=(tab[i][x]*m.tab[x][j]);	
			}
			nowa.uzupelnij(i,j,wart);
			nowa.wyswietlall();
			system("PAUSE");
	//		cout << wart << " ";
		}
	}
	return nowa;
}

macierz::macierz(int szerokosc,int wysokosc){
	szer=szerokosc;wys=wysokosc;
	tab=new int*[szer];
	for(int i=0;i<szer;i++) tab[i]=new int[wys];
}

macierz::macierz(){

}

int main(){
	macierz a(2,2); 
	a.uzupelnij(1,1,1);
	a.uzupelnij(1,2,2);
	a.uzupelnij(2,1,3);
	a.uzupelnij(2,2,4);
	macierz b(2,2);
	b.uzupelnij(1,1,2);
	b.uzupelnij(1,2,3);
	b.uzupelnij(2,1,4);
	b.uzupelnij(2,2,5);
	macierz f=a*b;
	f.wyswietlall();
	return 0;
}

Wie ktoś co zrobiłem źle?

0

Brak konstruktora kopiującego oraz operatora przypisania oraz konstruktor domyślny - totalna bzdura.

0

if(s>szer) ..
żeby zareagowało, s musi być o 1 większe od szer.
Raczej chodziło ci o to:
if(s>=szer)

/* edit */
Dobra, jak zwykle na daremno się udzielam.
tab[s-1][w-1]

(Nie nabijają mi się posty bo jadę na gościu, można wywalić)

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