Funkcja wyświetlania macierzy zawarta w klasie.

0

Witam.
Natknąłem się na stosunkowo nieduży problem.
Chciałem napisać zwykłą funkcję, która by wypisywała utworzoną wcześniej tablicę dwuwymiarową. Tak długo, jak wypisywanie wywołuję w konstruktorze, jest ok (czytaj: funkcja wypisywania jest dobrze napisana). Ale kiedy chciałem funkcję wpisać do ciała klasy, coś się dzieje ze stosem i program się buntuje. Śmiem twierdzić, że błąd leży gdzieś w przekazywaniu wartości do funkcji... Czy możecie rzucić okiem?
Dzięki wielkie.

class macierz
{
public:
    int liczba;
    macierz(int m, int n) : m(m), n(n)
    {
    int **tablica = new int*[n];
    for (int i=0; i<n; i++)
    {
        tablica[i] = new int[m];
        for (int j=0; j<m;j++)
        {
            cout << "Podaj "<<j+1<<" liczbe w wierszu "<<i+1<<":  ";
            cin >> liczba;
            tablica[i][j] = liczba;
        }

    }
    }

    static void wypisz(macierz mac)
    {
        for (int i=0; i<mac.n; i++)
        {
            for (int j=0; j<mac.m;j++)
                cout << mac.tablica[i][j] << "\t";
                cout << "\n";
        }
    }

private:
    int n, m, **tablica;
};

int _tmain(int argc, _TCHAR* argv[])
{
    macierz m1(2,2);
    macierz::wypisz(m1);

    return 0;
} 
0

Dziękuję serdecznie!

0

Po kiego paprać się z dwuwymiarową jeżeli wszystko da się załatwić jednowymiarową:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

class Matrix
  {
   private:
   size_t Y,X;
   int *T;
   protected:
   int width()const;
   public:
   Matrix():Y(0),X(0),T(0) {}
   Matrix(size_t Y,size_t X,int V=0):Y(Y),X(X)
     {
      size_t S=X*Y;
      T=new int[S];
      for(size_t i=0;i<S;++i) T[i]=V;
     }
   size_t Rows()const { return Y; }
   size_t Cols()const { return X; }
   ostream &out(ostream &s)const;
   istream &inp(istream &s);
   const int *operator[](size_t y)const { return T+y*X; }
   int *operator[](size_t y) { return T+y*X; }
  };
inline ostream &operator<<(ostream &s,const Matrix &m) { return m.out(s); }
inline istream &operator>>(istream &s,Matrix &m) { return m.inp(s); }

int Matrix::width()const
  {
   size_t S=Y*X;
   if(S<=0) return 1;
   int min=T[0],max=min;
   for(size_t i=1;i<S;++i) if(min>T[i]) min=T[i]; else if(max<T[i]) max=T[i];
   max=log10(abs(max))+(max<0)+1;
   min=log10(abs(min))+(min<0)+1;
   return min>max?min:max;
  }

ostream &Matrix::out(ostream &s)const
  {
   size_t S=Y*X;
   int w=1+width();
   for(size_t y=0,i=0;y<Y;++y,s<<endl)
     {
      for(size_t x=0;x<X;++x,++i)
        {
         if(&s==&cout) s<<setw(w-!x);
         s<<T[i];
         if(&s!=&cout) s<<'\t';
        }
     }
   return s;
  }

istream &Matrix::inp(istream &s)
  {
   size_t S=Y*X;
   for(size_t y=0,i=0;y<S;y+=X)
     {
      for(size_t x=0;x<X;++x,++i)
        {
         if(&s==&cin) cout<<"Matrix["<<y<<"]["<<x<<"]= ";
         s>>T[i];
        }
     }
   return s;
  }

int main()
  {
   Matrix m(2,2);
   cout<<"Podaj macierz:"<<endl;
   cin>>m;
   cout<<m<<endl;
   for(size_t y=0;y<m.Rows();++y) for(size_t x=0;x<m.Rows();++x) m[y][x]=(y+2)*(x+3);
   cout<<endl<<m<<endl;
   for(size_t y=0;y<m.Rows();++y) for(size_t x=0;x<m.Rows();++x) m[y][x]=(y-5)*(x+7);
   cout<<endl<<m<<endl;
   return 0;
  }

http://ideone.com/6fbisj

Przy okazji pokazany sprytny sposób na wyrównanie kolumn macierzy.

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