//matricidinamiche.cpp
//illustra uso array di array dinamici

#include <iostream.h>


void Stampa(int** mat, int m, int n)
{
  for(int i=0; i<m; i++) {
    for(int j=0; j<n; j++)
      cout << mat[i][j] << ' ';
    cout << endl;
  }
}


void StampaStatica(int mat[][4], int m) //sigh!
{
  for(int i=0; i<m; i++) {
    for(int j=0; j<4; j++)
      cout << mat[i][j] << ' ';
    cout << endl;
  }
}

void main()
{
  //mat dinamiche

  int m = 3;
  int n = 4;

  //creazione punt a mat dinamica
  int** mat;

  //allocazione mat dinamica
  mat = new int*[m];
  for(int i=0; i<m; i++)
    mat[i] = new int[n];

  //uso mat dinamica (nota: analogo a matrice statica)
  for (int i=0; i<m; i++)
    for (int j=0; j<n; j++)
      mat[i][j] = 100;  // cioe' *(*(mat+i)+j) = 100!

  //invocazione funz con parametro mat dinamica
  Stampa(mat,m,n);

  //deallocazione mat dinamica
  for(int i=0; i<n; i++)
    delete[] mat[i];
  delete[] mat;
  mat = NULL;


  //mat statiche e mat dinamiche

  //creazione matrice statica
  int mst[3][4];
  for (int i=0; i<3; i++)
    for (int j=0; j<4; j++)
      mst[i][j] = 200;  // cioe' *(mst+(i*numcol)+j) = 100!

  // Stampa(mat,n);  <-- ERR
  //invocazione funz con par
  //nota: 4 non lo passo perche' la funz deve essere specifica per matrici con
  //numero di colonna pari a 4!
  StampaStatica(mst,3);

  //mat statiche e dinamiche sono compatibili a livello di elementi
  //questo perche' per mat statiche:
  //mst[i][j] == *(mst+(i*numcol)+j) == *(*(mst+i)+j)
  mat = new int*[m];
  for(int i=0; i<m; i++)
    mat[i] = new int[n];

  for (int i=0; i<m; i++)
    for (int j=0; j<n; j++)
      mat[i][j] = mst[i][j]+100;

  Stampa(mat,m,n);
}

//curiosita' e' anche possibile allocare matrici dinamiche "triangolari"
//  mat = new int*[m];
//    for(int i=0; i<m; i++)
//       mat[i] = new int[i]; <-- nota!
