Problem z klasą macierzy

Odpowiedz Nowy wątek
2011-04-15 22:46
0

Witam. Mam (oby)mały problem z programem. Mieliśmy napisać klasę macierzy, której wartości są liczbami zespolonymi. Napisałem program na windowsie, wszystko działało, ogólnie super miodzie itd, do momentu aż sprawdziłem go na linuksie. Problem jest taki, że po drugim wywołaniu drugiej funkcji wyskakuje segmentation fault. Prawdopodobnie mam problem z konstruktorem kopiującym. Innym podejrzanym jest funkcja przypisz. Zamieszczę fragment kodu, jeśli ktoś ma chęć i wiedzę jak mi pomóc, to będę bardzo wdzięczny Wink
Fragmenty kodu:


class Matrix {
               Complex **macierz;
               int wiersz;
               int kolumna;

void Matrix::przypisz(const Matrix &m){
     int i;
     for(i=0;i<wiersz;i++)
          delete [] macierz[i];
     delete [] *macierz;
     wiersz=m.wiersz;
     kolumna=m.kolumna;
     macierz= new Complex *[wiersz];
     for(i=0;i<wiersz;i++)
          macierz[i]= new Complex[kolumna];
     for(i=0;i<wiersz;i++)
          for(int j=0;j<kolumna;j++)
               macierz[i][j].wpisz(m.pobierz(i, j));
     return; }

Matrix::Matrix(Matrix &m) {
     int i;
     wiersz=m.wiersz;
     kolumna=m.kolumna;
     macierz= new Complex *[wiersz];
     for(i=0;i<wiersz;i++)
          macierz[i]= new Complex[kolumna];
     for(i=0;i<wiersz;i++)
          for(int j=0;j<kolumna;j++)
               macierz[i][j].wpisz(m.pobierz(i, j));
     return; }

Matrix Matrix::odejmij(Matrix m) {
     if(kolumna!=m.kolumna || wiersz!=m.wiersz) {
          cout<<"Tych macierzy nie mozna odjac, maja rozne wymiary."<<endl;
          Matrix wynik;
          return wynik; }
     Matrix wynik(wiersz, kolumna);
     for(int i=0;i<wiersz;i++)
          for(int j=0;j<kolumna;j++)
               wynik.wpisz(i,j,(macierz[i][j].odejmij(m.pobierz(i,j))));
     return wynik; }

int main(int argc, char* argv[]) {
     Matrix m1(argv[1]);
     Matrix m2(argv[2]);
     cout<<endl<<"Macierz pierwsza:"<<endl;
     m1.pokaz();
     cout<<"Macierz druga:"<<endl;     
     m2.pokaz();
     cout<<endl<<"Suma macierzy:"<<endl;
     (m1.dodaj(m2)).pokaz();               //tutaj jeszcze działa
     cout<<endl<<"Roznica macierzy:"<<endl; 
     (m2.odejmij(m1)).pokaz();            //a tutaj sie wysypuje 

Funkcja dodaj odejmij wygląda podobnie. Jeśli ktoś wie co może być nie tak to zamieniam się w słuch

Pozostało 580 znaków

2011-04-23 21:12
0
MMan napisał(a)

void Matrix::przypisz(const Matrix &m){
Matrix::Matrix(Matrix &m) {
Matrix Matrix::odejmij(Matrix m) {

nie wczytywalem sie w kod, gdyz jest zbyt niekompletny*), ale fakt ze "odejmij" bierze argument przez wartosc a nie referencje moze byc znaczacy. sprawdz jego cctor'a

edit:

    • w niekompletnosci mam na mysli, ze brakuje kodu konstruktorow, destruktorow, operatorow przypisan i konwersji itp itp.. a rodzaj objawow sugeruje ze wlasnie gdzies w nich sa problemy

no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał
edytowany 1x, ostatnio: quetzalcoatl, 2011-04-25 13:06

Pozostało 580 znaków

2011-04-24 19:08
Tomek
0

A czy nie możesz zrobic jednej z poniższych rzeczy i sam dojść do źródła poblemu?

  1. puścić program pod debuggerem i zobaczyć gdzie się wywala
  2. jeśli masz core dumpa, to przejechac fo pstackiem (pstack ./core)
  3. dodać logowanie do programu i w ten sposób sobie pomóc.

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