Newsgroup: it.comp.lang.c++
Titolo: matrici dinamiche

Avrei la necessita' di creare delle matrici le cui dimensioni siano
fissabili a run-time mediante un parametro.
Volevo sapere se la cosa e' fattibile con il c++ standard, oppure se
esistono delle classi gia' fatte (uso lo GNU).
Avevo pensato di realizzarla cosi:
int* w1;
w1=new int*[k];
for(int i=0;i<=k;i++) w1[k]=new int*[n];
con k e n fissati precedentemente.
Poi non so' pero' se posso indirizzare ancora un dato come w1[alfa][beta], e
soprattutto se facendo una delete [] w1 mi viene distrutto tutto e se mi
rimane in memoria un po' di garbage.
/Metalman\

Se non sbaglio dovresti riuscire ad accedere alla matrice come da te scritto
mentre per distruggerla penso che tu debba ciclare e distruggerli uno ad uno
perche' delete[] chiama i distruttori dei singoli elementi ma non li
dealloca. Tra l'altro chiamerebbe il distruttore per i puntatori che
comunque non farebbe nulla.
Ciao.
--
Antonio Donatiello
SANPAOLO Spa









rimane in memoria un po' di garbage.
No, qui la delete[] w1 ti distruggerebbe solo quello che hai new'ato
in w1, cioe` i k puntatori, non i k*n interi puntati.  Ma soprattutto,
perche` mai preoccuparsi di new[], delete[], e puntatori, quando
i vector<> fanno quello che ci serve?!  GNU li supporta almeno
dalla 2.7.2 (ANNI fa...).
Ecco una classicella semplicissima per matrici di interi:
class mint {
    vector<int> v;
    int k, n;
public:
    mint(int k, int n): k(k), n(n) { v.resize(k*n); }
    int rows() const { return k; }
    int cols() const { return n; }
    int& operator()(int i, int j) { return v[i*n+j]; }
};
Questa si usa cosi`:
    mint m1(k, n);    // la creazione
    m1(i, j) = 23;     // l'accesso
L'uso delle parentesi tonde per l'indiciamento
ti parra` poco "C++oso", ma e` troppo comodo,
rispetto agli specchi su cui ci si deve arrampicare
(doppie indirettezze, oggetti proxy...), con perdita
di efficienza, per usare le quadre.
Secondo passo: perche` limitarsi agli interi?  Basta
scrivere anzitutto un "template<class T>", poi usare
T invece di int per designare i contenuti, e, miracolo,
abbiamo una generica matrice di "quel che vuoi".  Non
e` decisamente affatto difficile, guarda...:
template <class T>
class M {
    vector<T> v;
    int k, n;
public:
    mint(int k, int n): k(k), n(n) { v.resize(k*n); }
    int rows() const { return k; }
    int cols() const { return n; }
    T& operator()(int i, int j) { return v[i*n+j]; }
};
e adesso:
    M<int> m1(k,n);
    m1(2,3) = 45;
ma anche:
    M<double> m2(23,45);
    // ...
    m2(0,7) = m2(1,6)*m2(2,5);
eccetera, eccetera.
Alex

dalla 2.7.2 (ANNI fa...).
Mha, guarda io ho il GNU per dos (ora non mi ricordo che versione, comunque
abbastanza nuova) e se provo a scrivere il pezzo di codice che mi hai
mandato mi da' un bel syntax error prima della <.
Ho provato a scartabellare la documentazione dello GNU e non mi sembra che
da nessuna parte si parli di quel costrutto. Ma percaso va inclusa qualche
libreria? se si quale?
Grazie mille.

libreria? se si quale?
Se hai un compilatore vecchiotto, per usare vector dovrai probabilmente
fare:
	#include <vector.h>
	vector<int> mioVettore(23);	// eccetera
Se hai un compilatore piu` nuovo (nel mondo GNU, egcs e` la versione
piu` recente -- non credo esista per DOS, ma ce n'e` un ottimo
porting per Win32 [W/95, W/NT] chiamato "mingw32", oppure lo si
puo` usare invece del vecchio gcc come add-on all'ambiente Cygnus
"cygwin32" -- entrambi i port sono fatti da Mumit Khan; oppure,
Microsoft VC++ 5, o, Borland C++ Builder 3, eccetera);
	#include <vector>
	using std::vector;
	vector<int> mioVettore(23);	// eccetera
"Non c'e` altra abbondanza" in rete che di informazioni sulla
Standard C++ Library (spesso col suo vecchio nome di STL, "standard
template library"); ad esempio, da un'altra buona link page,
 
http://www.cs.bham.ac.uk/~jdm/cpp.html
troviamo una ventina di link, di cui parecchi a "tutorial" o
"primer" sulla libreria stessa.  Per esempio, 
 
http://web1.ftech.net/~honeyg/articles/tiny_stl.htm
e` un "Tiny Primer", molto compatto.  Un po' vecchiotto, del
1996, ma d'altronde la stessa Standard C++ Library e` in giro
ormai da circa quattro anni (almeno col nome di STL), il che, in
informatica, e` un paio di ere geologiche:-); gcc 2.7, che mi
pare sia uscito nel '95, ne comprendeva gia` una prima versione
(all'epoca come parte di libg++, credo).
Il punto-chiave e` che la Standard C++ Library e`, appunto, parte del
C++ Standard (che e` stato finalmente approvato nello scorso autunno,
al netto di certe lentezze burocratiche dell'ISO per cui non e` ancora
stato pubblicato definitivamente), quindi i libri recenti sul C++
standard la illustrano, cosi` come illustrano il resto del linguaggio.
Ad esempio, sia Lippman e Lajoie, "C++ Primer" 3a edizione, e
Stroustrup, "The C++ Programming Language" pure 3a edizione, e mi pare
anche Deitel e Deitel, "C++ how to program", 2a edizione mi sembra.
Alex
--
 ____    Alex Martelli, Bologna, Italia -- email: 
al...@magenta.com
 \SM/___                                 
http://magenta.com/~alex
  \/\bi/     You never know what is enough unless you know what
     \/          is more than enough.