Konwersja z tablicy dwuwymiarowej do wskaźnika**

0

Witam, to mój pierwszy post także z góry przepraszam za wszelkie niestosowności.
PROBLEM: Zależy mi na tym aby do argumentu funkcji(właściwie to konstruktora), który jest podwójnym wskaźnikiem

template <typename T>
Matrix<T>::Matrix(T**m)
 

móc podać tablicę zadeklarowaną przez użytkownika w ten sposób

double u[3][3]; 

czyli jednym słowem żeby działało poprawnie coś takiego:

Matrix<double> m(u); 

błąd, który wyrzuca mi kompilator: error: cannot convert 'double [3][3]' to 'double**' in assignment

Generalnie wiem, że mogę zrobić np tak

double zet**;
 zet= new double*[8];
for (int i=0;i<8;i++)
      {
            zet[i]=new double[9];
      }
      Matrix<double> m(zet);


}

ale nie o to mi chodzi.
Z góry dzięki za wszelką pomoc :)

1

Nie możesz czegoś takiego zrobić i już. Tablica x-wymiarowa to jest tak na prawdę ciągły blok pamięci i mógłbyś z niego zrobić najwyżej wskaźnik* i nic więcej ale wtedy dowolne odwołanie do tablica[x] daje ci już element i nie możesz go nijak indeksować. Podsumowując: nie da się tak zrobić.

0

Dzięki za informacje,myślałem że brak działania kodu wynika z mojej (nie)umiejętności posługiwania się wskaźnikami.

1

Masz nawet dwa możliwe rozwiązania:

#include <iostream>
using namespace std;

template<typename T> class Matrix
  {
   public:
   Matrix(T *m,unsigned Y,unsigned X)
     {
      for(unsigned y=0;y<Y;++y,cout<<endl) for(unsigned x=0;x<X;++x) cout<<' '<<*(m++);
      cout<<endl;
     }
   template<unsigned Y,unsigned X> Matrix(T (&m)[Y][X])
     {
      for(unsigned y=0;y<Y;++y,cout<<endl) for(unsigned x=0;x<X;++x) cout<<' '<<m[y][x];
      cout<<endl;
     }
  };

int main()
  { 
   double u[3][3]={{1,2,3},{4,5,6},{7,8,9}};
   Matrix<double> m((double*)u,sizeof(u)/sizeof(*u),sizeof(*u)/sizeof(**u));
   Matrix<double> M(u);
   return 0;
  }

http://ideone.com/Ty9ON6

0

O to mi chodziło, szczególnie ten fragment był pomocny:

 template<unsigned Y,unsigned X> Matrix(T (&m)[Y][X])
     { 
      for(unsigned y=0;y<Y;++y,cout<<endl) for(unsigned x=0;x<X;++x) cout<<' '<<m[y][x];
      cout<<endl;
     }

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