Newsgroup: it.comp.lang.c++
Titolo: [LUNGO] Ancora puntatori...

Saluti a tutti.
Di seguito alcune parti di un programma di prova che sto scrivendo.
Come capirete, voglio calcolare il determinante di una matrice. Allora
definisco una classe matricesqr come segue:
typedef double **matrice2D;
class matricesqr{
	matrice2D  mat;
 
	public:
	void inizializza(int ord); //alloca la memoria tramite new
	void init_valori(int ord); // inizializza i valori della matrice
	void distruggi(int ord);
	double det(int ord);  //celcola il determinante
	void stampa(int ord); //stampa la matrice di ordine ord
 
	};
di seguito la funzione det() incompleta, al momento deve solo ritornare
la matrice ottenuta dalla matrice originale eliminando la prima riga e
prima colonna:
double matricesqr::det(int ord)
{
matricesqr *mt;     
int i,j,h,k,r;
 
	mt = new matricesqr;  
 
	ord--;
 
	mt->inizializza(ord);
 
	i=h=k=0;
 
	for(r=1; r<ord+1; r++)
	    {
	    for(j=0; j<ord+1; j++)
		{
		if(j != i)
		    {
		    mt->mat[h][k] = mat[r][j];	
		    cout<<"\t"<<mt->mat[h][k];  //stampo la matrice [1]
		    k++;	
		    }	
		}
		h++;
		cout<<"\n";
	    }
 
	    mt->stampa(ord); // stampo ancora la matrice [2]
 
};
Le istruzioni [1] e [2]  danno output differenti. Peraltro, la funzione
stampa() non e' nulla di trascendentale:
void matricesqr::stampa(int ord)
{
int i,j;
 
	for(i=0; i<ord; i++)
		{
		for(j=0; j<ord; j++)
			{
			cout<<"\t"<<mat[i][j];	
			}
			cout<<"\n";
		}
		cout<<"\n\n";
};
Il main() e' semplicemente:
void main()
{
matricesqr *m;
int i;
 
	m = new matricesqr;
 
	m->inizializza(MAX_N);	
	m->init_valori(MAX_N);
 
	m->stampa(MAX_N);          //questa funziona [3]
 
	m->det(MAX_N);
 
	m->distruggi(MAX_N);
 
}
Se questa e' la matrice iniziale:
[3]
	0       1       2       3
        4       5       6       7
        8       9       10      11
        12      13      14      15 
questi sono gli output:
[1]
	5       6       7
        9       10      11
        13      14      15
[2]
        5       6       7   
        0       0       0	?????
        10      11      0       ?????  
Non riesco a capire dov'e' l'errore!!!
Ringrazio molto chi mi potra' aiutare e mi scuso per la prolissita'.
-- 
Saluti 	 		      << Linux Powered >>			 
LIBRA               e-mail: metti "libero" al posto di "NOSPAM"  

 for(j=0; j<ord+1; j++)
Dovrebbe essere 
        for(j=1; j<ord; j++)

        for(r=1; r<ord; r++)
No, ord+1 perche' all'ingresso della funzione avevo messo un ord--;
Quindi la matrice di origine e' di grado ord+1.
Grazie.
-- 
Saluti 	 		      << Linux Powered >>			 
aIBRA               e-mail: metti "libero" al posto di "NOSPAM"  

 ricorsive?
jordanizzazione con moltiplicazione della sola diagonale

 Quindi la matrice di origine e' di grado ord+1.
Si hai ragione tu; peccato che poi passi un parametro + piccolo a 'void 
matricesqr::inizializza(int ord)' ....
dovresti invocarla con
mt->inizializza(ord+1);
Ma  a questo punto non si capisce perchè 'ord--'

mt->inizializza(ord+1);
No, perche' ad ogni chiamata di det() la matrice e' di un ordine piu'
piccolo. Se la matrice iniziale e' di ordine 3 (ed e' inizializzata nel
main) , la matrice che inizializzo con mt->inizializza(ord)  
sara' di ordine 2, (quindi ord--).
Comunque, ho deciso di lasciar perdere questo metodo (per il momento,
perche' comunque voglio riuscire a finirlo, anche solo per
esercitazione) e di utilizzare il metodo di triangolarizzazione che mi
avete suggerito.
Grazie per l'aiuto.
-- 
Saluti 	 		      << Linux Powered >>			 
LIBRA               e-mail: metti "libero" al posto di "NOSPAM"  

 sara' di ordine 2, (quindi ord--).
Riposto il codice ....
[ codice postato originariamente ]----------------------------
double matricesqr::det(int ord)
{
matricesqr *mt;     
int i,j,h,k,r;
 
        mt = new matricesqr;  
 
        ord--;
 
        mt->inizializza(ord);
 
        i=h=k=0;
 
        for(r=1; r<ord+1; r++)
            {
            for(j=0; j<ord+1; j++)
                {
                if(j != i)
                    {
                    mt->mat[h][k] = mat[r][j];        
                    cout<<"\t"<<mt->mat[h][k];  //stampo la matrice [1]
                    k++;        
                    }        
                }
                h++;
                cout<<"\n";
            }
 
            mt->stampa(ord); // stampo ancora la matrice [2]
 
};
void matricesqr::inizializza(int ord)
{
int i;
        mat = new double *[ord];
                if(!mat) cout<<"\n Errore";
        for(i=0; i<ord; i++)
                {
                mat[i] = new double [ord];
                        if(!mat[i]) cout<<"\n Errore";
                }
};
[ codice postato originariamente ]----------------------------
Te allochi una matrice [ord][ord] che ha ord x ord elementi, numerati da 
[0..ord-1]  ( estremi compresi ); Mentre te accedi in un indice [1..ord]  e 
nell'altro [0..ord]. L'errore è la.