c++ konwersja

Odpowiedz Nowy wątek
2015-01-23 23:16
0

Hej. Chciałam zapytać, czy dobrze zdefiniowałam konwersje typu Wektor na Macierz:

class Wektor
{
private:
    unsigned int _n;
    float * _W;

public:
    Wektor(unsigned int n);
    ~Wektor();
    void Wczytaj();
    void Wypisz();
    unsigned int Dl();
}; 
class Wektor;

class Macierz 
{
private:
    unsigned int _m;
    unsigned int _n;
    float ** _A;
public:
    static unsigned int ileMacierzy;
    Macierz(unsigned int n, unsigned int m);
    //~Macierz();
    Macierz Transponuj();
    Macierz(Wektor & W);
    Macierz MnozRazySkalar(float skalar);
    Macierz operator+(const Macierz & M1);
    Macierz operator-(const Macierz & M1);
    Macierz operator=(const Macierz & M1);
    Macierz operator*(const Macierz & M2);
    Macierz(const Macierz& M);
    void Wczytaj();
    void Wypisz();
    Macierz ZmienZnak();
    bool JestSymetryczna();
    float NormaMaksimum();
    float NormaFrobeniusa();
};
Macierz::Macierz(Wektor & W)
{
    _n=W.Dl();
    _m=1;
} 

Program kompiluje się bez błędów, ale gdy dochodzi do pomnożenia macierzy przez wektor wszystko się zawiesza i pojawia się komunikat, że wystąpił problem z aplikacją i zostanie ona zamknięta. Nie wiem czym jest to spowodowane. Może ta konwersja nie jest taka jak powinna być?

void WymnozMacierzePrzezWektor(Macierz &M1, Macierz &M2)
{
    int n;
    cout << " Podaj liczba elementow wektora: ";
    cin >> n;

    Wektor W(n);

    W.Wczytaj();
    cout << endl;
    cout <<  "Wektor: " << endl;
    W.Wypisz();
    cout << endl;   
    char wybor;
    cout << endl;
    cout << "Wymnoz przez wektor macierze: ( 1->M1 / 2->M2 / 3->obie): ";
    cin >> wybor;
    switch (wybor)
    {
        case '1':
            M1 = M1*W; 
            break;
        case '2':
            M2 = M2*W; 
            break;
        case '3':
            M1 = M1*W; 
            M2 = M2*W; 
            break;
        default:
            cout << endl;
            return;
    }
    cout << endl;
    return;
}
Macierz Macierz::operator*(const Macierz & M2)
{

    Macierz C(this->_m, M2._n);

    if (this->_n != M2._m)
    {
        cout << "Blad: nie mozna wymnozyc obu macierzy - konflikt rozmarow: " << this->_m <<"x"<< this->_n <<" vs "<<  M2._m <<"x" << M2._n << endl;
        exit(1);
    }

    float suma;
    for(unsigned int i = 0 ; i < _m ; i++) 
    {
        for(unsigned int j = 0; j < M2._n; j++)
        {
            suma = 0;
            for (unsigned k = 0; k < _n; k++)
                suma += _A[i][k] * M2._A[k][j];
            C._A[i][j] = suma;
        }

    }
    cout << "Iloczyn macierzy M1 i M2 wynosi: " << endl;
    cout << endl;
    C.Wypisz();
    return C;
}

Pozostało 580 znaków

2015-01-24 00:24

Oczywiście że jest źle.

  1. Wektor ma jednowymiarową tablicę float* a Macierz ma u ciebie dwuwymiarową tablicęfloat** więc chyba od razu widać że to nie zadziała?
  2. Takie przypisanie wskaźnika to proszenie sie o guza. Kto potem zwalnia tą pamięć? Bo masz ten sam wskaźnik w dwóch klasach i pewnie każda spróbuje na nim zrobić delete na koniec...

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-01-24 00:29
0

Już rozumiem, dzięki;)

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