C++ Macierz jako struktura - konstruktor?

Odpowiedz Nowy wątek
2014-12-19 23:43
0

Jako, że to mój pierwszy post na tym forum to najpierw się przywitam. Witam wszystkich programistów.
A teraz do sedna, próbuję napisać strukturę obsługującą macierze. Wszystko jakoś idzie, macierz niby się tworzy, błędów i ostrzeżen w kompilacji żadnych nie ma. Problem pojawia się gdy próbuję się odwołać do wartości macierzy. Program się wywala i tyle.
Poniżej zamieszczam kod struktury:

struct matrix
{
    int h;
    int w;
    int **values;
    matrix(int height, int width)
    {
        h = height;
        w = width;
        int **values = new int*[h];
        for (int i = 0; i < h; i++)
        {
            values[i] = new int[w];
            for (int j = 0; j < w; j++)
            {
                values[i][j] = 0;
            }
        }
    }
    matrix(int height, int width, int ** val)
    {
        h = height;
        w = width;
        int **values = new int*[h];
        for (int i = 0; i < h; i++)
        {
            values[i] = new int[w];
            for (int j = 0; j < w; j++)
            {
                values[i][j] = val[i][j];
            }
        }
    }
    matrix operator+(matrix x)
    {
        matrix wynik = matrix(x.h, x.w);
        for (int i = 0; i < x.h; i++)
            for (int j = 0; j < x.w; j++)
                wynik.values[i][j] = this->values[i][j] + x.values[i][j];
        return wynik;
    }
    matrix operator-(matrix x)
    {
        matrix wynik = matrix(x.h, x.w);
        for (int i = 0; i < x.h; i++)
            for (int j = 0; j < x.w; j++)
                wynik.values[i][j] = this->values[i][j] - x.values[i][j];
        return wynik;
    }
 
};

W tytule napisałem, że jest to błąd konstruktora, bo szczerze mówiąc, nie wiem co innego miało by tu nie działać. I dla przykładu dorzucę jeszcze fragment z main:

    int szer = 3, wys = 3;
    int **tab = new int *[wys];
    for (int i = 0; i < wys; i++)
    {
        tab[i] = new int[szer];
        for (int j = 0; j < szer; j++)
        {
            tab[i][j] = (i + 1)*(j + 1);
        }
    }
    matrix macierz1 = matrix(3, 3, tab);
    cout << macierz1.values[0][0];//Tu sie wszystko psuje :( 

Chętnię wysłucham każdej wskazówki, każda pomoc mile widziana, z góry dziękuję.

edytowany 2x, ostatnio: Parostatek, 2014-12-19 23:50

Pozostało 580 znaków

2014-12-19 23:51
0

http://www.cplusplus.com/doc/tutorial/dynamic/

Pozostało 580 znaków

2014-12-19 23:53
0

Mam rozumieć, że mam błąd w tworzeniu dynamicznej tablicy?

Pozostało 580 znaków

2014-12-20 00:14
1

Najlepiej nie tworzyć tablicy dwuwymiarowej:

class matrix
  {
   private:
   size_t Y,X;
   int *tb;
   ostream &prn(ostream &s)const { for(size_t y=0,i=0;y<Y;++y,s<<endl) for(size_t x=0;x<X;++x,++i) s<<tb[i]; return s; }
   public:
   class error {};
   matrix(size_t Y,size_t X):Y(Y),X(X),tb(new int[Y*X]);
   size_t Ysize()const { return Y; }
   size_t Xsize()const { return X; }
   int *operator[](size_t y) { return tb+y*X; }
   matrix &operator+=(const matrix &m) { if((Y!=m.Y)||(X!=m.X)) throw error(); memcpy(tb,m.tb,Y*X*sizeof(int)); return *this; }
   matrix operator+(const matrix &m)const { matrix tmp(*this); tmp+=m; return tmp; }
   friend ostream &operator<<(ostream &,const matrix &m) { return m.prn(s); }
  };
 
    matrix m=matrix(3,3);
    for(int y=0;y<m.Ysize();++y) for(int x=0;x<m.Xsize();++x) m[y][x]=(y+1)*(x+1);
    cout<<m<<endl;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Nie zapomnieć o: destruktor, konstruktor kopiujący, operator przypisania. - _13th_Dragon 2014-12-20 00:14
Xsize, Ysize masz na myśli width i height? :P - spartanPAGE 2014-12-20 00:17
Do mnie bardziej przemawiają Xsize i Ysize - dla macierzy, dla obrazka może być - width i height - _13th_Dragon 2014-12-20 00:21
Jedno mnie zastanawia, mianowicie tego typu problemy, jak w tym wątku średnio pojawiają się raz na tydzień i w związku z tym ciekawi mnie, czy Ty za każdym razem piszesz od nowa ten sam kod, czy szukasz w swoim zbiorze rozwiązań takich zadanek i przekopiowujesz kod? :D - satirev 2014-12-20 10:33
Kod piszę znacznie szybciej niż normalny tekst po polsku, tak prymitywne kody nawet nie zachowuję. - _13th_Dragon 2014-12-20 15:25

Pozostało 580 znaków

2014-12-20 00:26
0

_13th_Dragon
Twój sposób działa, ale chciałem się sam nauczyć, a nie dostawać gotowca .Nie żebym nie doceniał Twojego wkładu, ale właśnie dlatego szukam odpowiedzi co jest nie tak z moim kodem. No nic, jutro dalej będę myślał, bo dziś już głowa nie ta.
Jeszcze raz dzięki za pomoc, ale chciałbym "naprawić" swój kod (chyba zrobię to na malloc'u :D może to coś zmieni, bo już brak mi pomysłów).

jeśli z new miałeś źle to na pewno z malloc będzie nielepiej - twonek 2014-12-20 00:44

Pozostało 580 znaków

2014-12-20 00:31
0
matrix macierz1 = matrix(3, 3, tab); // to psuje
_13th_Dragon napisał(a):

Nie zapomnieć o: destruktor, konstruktor kopiujący, operator przypisania.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-20 00:42
matrix(int height, int width, int ** val)
{
    ....
    int **values = new int*[h];
    ....
}
 

Tworzysz lokalną zmienną o nazwie values przesłaniając pole klasy o tej samej nazwie i coś z nią robisz, po czym wychodzisz z konstruktora i pole klasy o nazwie values ciągle na nic nie wskazuje. Podobnie z drugim konstruktorem.
Btw wycieki wycieki wycieki.

Pozostało 580 znaków

2014-12-20 10:01
0

Dobra dzięki za wszystko dziś już to naprawiłem. A destruktora nie robiłem, bo nie lubię robić czegoś do przodu (skoro nawet konstruktor nie działał). Zaraz się zajmę destruktorem, a później tylko template zostaną. Myslę, że sobie poradzę.
Jeszcze raz dzięki za wszystko.

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