Klasa macierz - naruszenie ochrony pamięci

Odpowiedz Nowy wątek
2013-04-03 10:26
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?

edytowany 1x, ostatnio: rootman2, 2013-04-03 10:27
Debugger, podglad na zmienne lokalne i sprawdzaj krok po kroku gdzie jest blad. - Krycho 2013-04-03 10:35

Pozostało 580 znaków

2013-04-03 11:42
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2013-04-03 11:43

Pozostało 580 znaków

2013-04-03 11:56
spartanPAGE
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ć)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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