[c++] dwuwymiarowa tablica dynamiczna access violation

Odpowiedz Nowy wątek
2008-05-24 17:23

Rejestracja: 12 lat temu

Ostatnio: 2 lata temu

0

Napisałem taką klasę, do obsługi macierzy dow. rozmiarów:

class Macierz
{
    private:
            int m;
            int n;
    public:
        double** elementy;
        Macierz(int, int);
        ~Macierz();
        Macierz operator+ (const Macierz&);
        Macierz operator- (const Macierz&);
        Macierz operator* (double);
        Macierz operator* (const Macierz&);
        double* operator[] (int);
        friend ostream& operator<< (ostream&, Macierz);
        friend istream& operator>> (istream&, Macierz);
};

Macierz::Macierz(int x, int y) :m(x), n(y)
{
    elementy = new double*[m];
    for (int i = 0; i < m; i++) {
        elementy[i] = new double[n];
    }
}

Macierz::~Macierz()
{
    for (int i = 0; i > m; i++) {
        delete[] elementy[i];
    }
    delete[] elementy;
}

Macierz Macierz::operator+ (const Macierz& k)
{
    if (k.m != m || k.n != n) throw "Nieprawidlowa operacja! Rozmiary macierzy sa rozne!";
    Macierz wynik(m, n);
    for(int i = 0; i < m; ++i) {
        for(int j = 0; j < n; ++j) {
            wynik.elementy[i][j] = elementy[i][j] + k.elementy[i][j];
        }
    }
    return wynik;
}

//implementacje reszty operatorow niemal identyczne...

double* Macierz::operator[] (int k)
{
    if (k>=m) throw "Nieprawidlowa operacja! Odwolanie do nieistniejacego elemntu macierzy!";
    return elementy[k];
}

ostream& operator<< (ostream& strumien, Macierz a)
{
    for (int i = 0; i < a.m; i++) {
        for (int j = 0; j < a.n; j++) {
            strumien << a[i][j] << " ";
        }
        strumien << endl;
    }
    return strumien;
}

istream& operator>> (istream& strumien, Macierz a)
{
    for (int i = 0; i < a.m; i++) {
        for (int j = 0; j < a.n; j++) {
            strumien >> a[i][j];
        }
    }
    return strumien;
}

Używam tej klasy w taki sposób:

int main(int argc, char* argv[])
{
    Macierz pierwsza (3, 3);
    Macierz druga (3,3);
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            pierwsza[i][j]=1;
            druga[i][j]=2;
        }
    }
    Macierz trzecia = pierwsza+druga;
    cout << pierwsza << druga << trzecia;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << trzecia[i][j] << " ";
        }
        cout << endl;
    }
    system("PAUSE");
    return 0;
}

Obiekty tej klasy stworzone ręcznie bez problemu przechodzą przez wszelkie wywołania, natomiast problem pojawia się przy obiektach stworzonych przy pomocy operatorów (jak 'trzecia' w moim programie) Niezależnie jak próbuję się odwołać do jej składników (przez operator<< czy przez operator[]) wywala mi access violation. Kiedy skasuję destruktor, wszystko jest ok.
Używam turbo c++.


The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' (I found it!) but 'That's funny'

Pozostało 580 znaków

2008-05-24 18:01

Rejestracja: 16 lat temu

Ostatnio: 6 lat temu

0

Brakuje ci konstruktora kopiującego. Napisanie go rozwiąże twój problem.

Pozostało 580 znaków

2008-05-24 18:45

Rejestracja: 12 lat temu

Ostatnio: 2 lata temu

0

No jasne idiotyczny błąd. ;P Działa dzięki :)


The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' (I found it!) but 'That's funny'

Pozostało 580 znaków

Odpowiedz

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