Problem z dodawaniem macierzy

0
    system("cls");
    char p1[10],p2[10];
    int c1,c2;
    lista.WypiszListe(); // wyswietla liste
    do{
    cout<<"Podaj numer pierwszej macierzy z ktorej chcesz skorzystac. \n";
    cin>>p1;
    c1 = atoi(p1);
    if(c1 == 0)
    {
        cout<<"Na liscie nie ma macierzy o takim numerze.\nSprobuj ponownie...";
        Sleep(1500);
    }
    else
    break;
    }while(!(atoi(p1)));
    do{
    cout<<"Podaj numer drugiej macierzy z ktorej chcesz skorzystac. \n";
    cin>>p2;
    c2 = atoi(p2);
    if(c2 == 0)
    {
        cout<<"Na liscie nie ma macierzy o takim numerze.\nSprobuj ponownie...\n";
        Sleep(1500);
    }
    else
    break;
    }while(!(atoi(p2))); // atoi sluza do zabezpieczenia przed wcisnieciem zlego klawisza.
    lista.ZnajdzWybrana(c1)+lista.ZnajdzWybrana(c2); // metoda zwraca obiekt znajdujacy sie na liscie
//    lista.DodajNaKoniec();

Mam program operacje na macierzach, przeladowane operatory itd., lista.ZnajdzWybrana(c1) zwraca wskaznik na obiekt i teraz zaczyna sie moj problem.

Chcialbym zrobic tak aby mozna bylo dodac 2 macierze do siebie, zwrocic to jaka nowa macierz, a ta nowa macierz wrzucic na koniec listy.

lista.dodajnakoniec(stala klasy matrix&) przyjmuje jako parametr adres obiektu klasy macierzowej.

Jestem poczatkujacym programista, piszę od 2 miesięcy, w razie błędów przepraszam.

1

lista.DodajNaKoniec(lista.ZnajdzWybrana(c1)+lista.ZnajdzWybrana(c2));

z tym że powinieneś przeładować operatory aby wyglądało to następująco:
lista<<(lista[c1]+lista[c2]);

0

ok spróbuje przeładować operator << dla listy,

a to lista [c1] to tez jest przeladowany operator [].

Wiem ciezko cos wytlumaczyc poczatkujacemy.

0

lista.DodajNaKoniec(lista.ZnajdzWybrana(c1)+lista.ZnajdzWybrana(c2));

Zrobiłem tak i pokazało mi taki magiczny bład.

In function 'void Dodawanie()':
main.cpp error: no matching function for call to 'ListaMacierzy::DodajNaKoniec(cMatrix)'|
ListaMacierzy.h note: candidates are: void ListaMacierzy::DodajNaKoniec(cMatrix&)|
||=== Build finished: 1 errors, 0 warnings ===|

0

void ListaMacierzy::DodajNaKoniec(const cMatrix&)

0

ok to działa, lecz na liste wrzuca mi jakies bzdury :/ jako macierz wynikowa.

2ga sprawa.
Mam przeładowany operator + i zabezpieczenie, że jak rozmiary macierzy są różne to nie można ich dodać zwraca komunikat, lecz przy działaniu programu program się po prostu zawiesza :/

0

wszystkie magiczne kulę się pokończyły. Więc Ci nie wywróżę, dlaczego masz błąd (i gdzie). Pokaż kod.
Dodatkowo polecam zapoznać się z debuggerem.

0

W załączniku dałem pliki źródłowe.

0

To co ktoś ma jakiś pomysł dlaczego jakieś bzdury mi wpisuje ? :/

0

Wklej kod na forum, bo nie każdy chce: ściągać RAR'a, rozpakowywać, otwierać w IDE, składać do projektu.

0
 
void Dodawanie()
{

    system("cls");
    char p1[10],p2[10];
    int c1,c2;
    lista.WypiszListe();
    do{
    cout<<"Podaj numer pierwszej macierzy z ktorej chcesz skorzystac. \n";
    cin>>p1;
    c1 = atoi(p1);
    if(c1 == 0)
    {
        cout<<"Na liscie nie ma macierzy o takim numerze.\nSprobuj ponownie...";
        Sleep(1500);
    }
    else
    break;
    }while(!(atoi(p1)));
    do{
    cout<<"Podaj numer drugiej macierzy z ktorej chcesz skorzystac. \n";
    cin>>p2;
    c2 = atoi(p2);
    if(c2 == 0)
    {
        cout<<"Na liscie nie ma macierzy o takim numerze.\nSprobuj ponownie...\n";
        Sleep(1500);
    }
    else
    break;
    }while(!(atoi(p2)));
//
//    if(lista.ZnajdzWybrana(c1) == 0 )
//    {
//        cout<<"Nie znaleziono macierzy na liscie, gdyz macierz o numerze "<< c1 << " nie istnieje.\n";
//    }

   lista.DodajNaKoniec((lista.ZnajdzWybrana(c1))+(lista.ZnajdzWybrana(c2)));


}

funkcja dodaj w main.

 

ostream &operator << (ostream& out,const cMatrix& ob)
{
    if(!ob.matrix)
    {
        system("pause");
    }

    cout<<"Macierz ma postac: \n";
    out << endl;
    for(int i=0; i<ob.ileWierszy(); ++i)
    {
        out <<'|';
        for(int j=0;j<ob.ileKolumn(); ++j)
        {
            out << setw(4) << ob.matrix[i][j];
        }
        out <<" |" <<endl<<endl;
    }

    return out;

}

po odpaleniu debuggera wchodzi mi to przeładowanego operatora <<, a w wyniku dodawania mam jakieś przypadkowe wyniki.

Przytestowaniu: stworzylem nowe 3 obiekty dodalem 2 i wpisalem do 3, a nastepnie wyswietlilem to wszystko było w porządku.

0

błąd może być w DodajNaKoniec, w operatorze +, w braku konstruktora kopiującego, w braku operatora =

0

To wrzuce po kolei:

operator +

 cMatrix operator + (const cMatrix& a, const cMatrix& b)
{
    if(a.ileWierszy() != b.ileWierszy())
    {
        cout << "Macierze dodawane musza miec ten sam rozmiar nie mozna wykonac dzialania! \n";
        exit(1);
    }
    if(a.ileKolumn() != b.ileKolumn())
    {
        cout << "Macierze dodawane musza miec ten sam rozmiar nie mozna wykonac dzialania! \n";
        exit(1);
    }

    cMatrix wynik(a.ileWierszy(),a.ileKolumn());

    for(int i=0; i<wynik.ileWierszy(); ++i)
        for(int j=0; j<wynik.ileKolumn();++j)
            wynik.matrix[i][j] = a.matrix[i][j] + b.matrix[i][j];

    return wynik;
}

kons. kopiujacy:

cMatrix::cMatrix(const cMatrix &m,char *nazwa)
{
    iloscWierszy = m.iloscWierszy;
    iloscKolumn = m.iloscKolumn;
    matrixName = 0;

    if(m.matrixName!=0)
    {
        matrixName = new char[strlen(nazwa)+1];
        //assert(matrixName!=0);
        strcpy(matrixName,nazwa);
    }

    UtworzMacierz(iloscWierszy,iloscKolumn);

    if(*this==m) return;
    for (int i = 0;i<iloscKolumn; i++)
        for(int j = 0;j<iloscWierszy; j++)
            matrix[i][j] = m.matrix[i][j];

} 

operator =

 cMatrix& cMatrix::operator = (const cMatrix &m)
{
    UtworzMacierz(m.iloscWierszy, m.iloscKolumn);
        for( int i=0; i<iloscWierszy; i++ )
            for( int j=0; j<iloscKolumn; j++ )
                matrix[i][j] = m.matrix[i][j];

	return *this;
}

Lista dodaj na koniec

void ListaMacierzy::DodajNaKoniec(const cMatrix &m)
{
    cMatrix *nowa = new cMatrix(m);
    nowa->poprzednia=ostatnia;
    nowa->nastepna=NULL;
    if(ostatnia==NULL)
    {
        pierwsza=nowa;
    }
    else
    {
        ostatnia->nastepna=nowa;
    }
    ostatnia=nowa;
    LiczbaMacierzy++;

} 

Siedziałem 6h dziś i nie potrafię sobie sam poradzić :/

1

Więc masz problem z brakiem konstruktora kopiującego:
cMatrix::cMatrix(const cMatrix &m,char *nazwa) // nie jest konstruktorem kopiujacym
Musisz jeszcze pokazać co to za konstruktor wołasz:
cMatrix wynik(a.ileWierszy(),a.ileKolumn());

0
 
cMatrix::cMatrix(int ileWierszy, int ileKolumn)
{
    matrixName = 0;
    try{
    UtworzMacierz(ileWierszy,ileKolumn);}
    catch(bad_alloc)
    {
        cout<<"Nie udalo sie zaalokowac pamieci!";
    }

    nastepna = NULL;
    poprzednia = NULL;
}

I metoda wywolywana w konstruktorze

 
void cMatrix::UtworzMacierz(int ileWierszy, int ileKolumn)
{
    try
    {
    usunMacierz();

    if(ileWierszy <= 0)
    return;

    matrix = new double*[ileWierszy];

    if(!this->matrix)
    {
        cout<<"Nie moge utworzyc macierzy! \n";
        return;
    }

    this->iloscWierszy = ileWierszy;
    if(ileKolumn > 0)
    {
        this->iloscKolumn = ileKolumn;
    }
    else
        this->iloscKolumn = ileWierszy;

    for(int i=0; i<iloscWierszy; i++)
    {
        matrix[i] = new double[iloscKolumn];
        if(!matrix[i])
        {
            usunMacierz();
            cout<<"Tworzenie macierzy nie powiodlo sie! \n";
            return;
        }
    }

    //Zerowanie macierzy
    for (int i=0; i<iloscWierszy; i++)
    {
        for(int j = 0; j<iloscKolumn; j++)
        {
            matrix[i][j] = 0;
        }
    }
    }
    catch(int e)
    {
        cout<<"Wyjatek numer: "<<e<<"!"<<endl;
    }
}

A teraz to jest konstruktor kopiujący?

cMatrix::cMatrix(const cMatrix &m)
{
    iloscWierszy = m.iloscWierszy;
    iloscKolumn = m.iloscKolumn;


    UtworzMacierz(iloscWierszy,iloscKolumn);

    if(*this==m) return;
    for (int i = 0;i<iloscKolumn; i++)
        for(int j = 0;j<iloscWierszy; j++)
            matrix[i][j] = m.matrix[i][j];

}
 
1

to już tak, i teraz powinno działać :D

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