Newsgroup: it.comp.lang.c++
Titolo: array dinamici multidimensionali

Ciao a tutti.
Come si fa a creare array dinamici multidimensionali ?
Mi spiego:
// array dinamico a 1 dimensione
int *a;
int dim=10;
a = new int[dim];
a[0] = 10;
funziona.
Ma se io volessi avere un array a due indici a[][] come si fa ?
Le ho provate tutte, ma senza successo :-(
Grazie

 Come si fa a creare array dinamici multidimensionali ?
Dalla FAQ:
8) Come posso allocare dinamicamente una matrice a piu` dimensioni e
   utilizzare la notazione M[i][j]?
R) Ecco alcune possibilita`, alcune richiedono un po' di impegno,
   studiatele bene prima di porre eventuali quesiti sul NG.
   Approccio tradizionale di basso livello:
   #include <iostream>
   #include <iomanip>
   using namespace std;
   int main() {
     int** Matrice = new int* [10];
     // alloca la prima dimensione
     for(int i=0; i<10; ++i)
       Matrice[i] = new int [10];
     // allocazione della seconda dimensione
     // e inizializzazione della matrice
     for(int i=0; i<10; ++i)
       for(int j=0; j<10; ++j)
         Matrice[i][j] = (i+1) * (j+1);
     // visualizza il valore dei vari elementi
     for(int i=0; i<10; ++i) {
       for(int j=0; j<10; ++j)
         std::cout << setw(3) << Matrice[i][j] << " ";
        std::cout << std::endl;
      }
     // Deallocazione della matrice.
     // Notare che la deallocazione avviene in ordine
     // inverso rispetto all'allocazione
     for(int i=0; i<10; ++i)
        delete[] Matrice[i];
     delete[] Matrice;
   }
   Un approccio basato su vector:
   #include <vector>
   template<class T>
   class matrix {
       typedef std::vector<T> riga;
       std::vector<riga> body;
     public:
       void setSize(int x, int y) {
         body.resize(0);    // getta tutto
         body.resize(x);    // riparte
         for(int i=0; i<x; ++i)
           body[i].resize(y);
       }
       void getSize(int &x, int &y) {
         x = body.size();
         if(x) y=body[0].size();
         else y=0;
       }
       matrix() {}
       matrix(int x, int y) { setSize(x,y); }
       // non occorre dtor esplicito, quello di
       // default e` OK
       std::vector<T>& operator[](int i) { return body[i]; }
       const std::vector<T>& operator[](int i) const { return body[i]; }
   };
   Un altro, piu` a basso livello e che presenta eguale
   interfaccia d'uso pur utilizzando in realta` un semplice
   vettore e non una matrice:
   template<class T>
   class matrix {
       T* body;
       int x; int y;
     public:
       void setSize(int x, int y) {
         if(body) delete[] body;    // getta tutto
         body = new T[x*y];         // riparte
         this->x = x;
         this->y = y;
       }
       void getSize(int &x, int &y) {
         x = this->x;
         y = this->y;
       }
       matrix(): body(0) {}
       matrix(int x, int y): body(0) { setSize(x,y); }
       ~matrix() { if(body) delete[] body; }
       T* operator[](int i) { return body+i*y; }
       const T* operator[](int i) const { return body+i*y; }
   };
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

          Matrice[i][j] = (i+1) * (j+1);
e chiaramente qui fa solamente l'inizializzazione
-- 
Ciao!

 [...]
Corretti, grazie! Eccola versione aggiornata:
http://www.emagsoftware.it/faqcpp.txt


Mi cospargo il capo di cenere e sentitamente ringrazio.
Aldo
w.emagsoftware.it/tbosg