PDA

Visualizza la versione completa : [c] memoria dinamica con matrici


pdpmpd
17-02-2004, 19:34
ho un problema cui non riesco a venire a capo:
ho scritto una funzione ricorsiva per il calcolo del determinante di una matrice X*X, che deve allocare una matrice di double per fare ogni volta il complemento algebrico dell'elemento che si sta calcolando. Il problema sorge inizialmente (alla prima chiamata), quando viene allocato il puntatore della matrice "Compl" (in grassetto): il programma riceve un segnale di segmentation fault e si termina. Usando il debugger (gdb) ho provato a settare un breakpoint sul calloc(), ma a quel punto il programma non ci arriva nemmeno! si termina prima!
Facendo varie prove ho verificato che il problema proprio in quella riga (anche se non sembra essere il calloc :bh: ), ma non riesco a capire che errore sto facendo.


double Determinante(double **Matrix, int Order) {
if (Order==2) return (Matrix[0][0]*Matrix[1][1]-Matrix[0][1]*Matrix[1][0]);
else {
int cx,cy,cz,xz,sign=1;
double Res=0;
double **Compl=(double **)calloc(Order-1,sizeof(double *));
for (cx=0; cx<Order-1; cx++) *(Compl+cx)=(double *)calloc(Order-1,sizeof(double));
for (cx=0; cx<Order; cx++,sign=-sign) {
for (cy=0,xz=0; cy<Order;xz++)
if (xz!=cx)
for (cz=0; cz<Order-1; cz++) Compl[cy++][cz]=Matrix[xz][cz+1];
Res+=sign*Matrix[cx][0]*Determinante(Compl, Order-1);

}
free(Compl);
return Res;
}
}
qualcuno pu aiutarmi? grazie.

pdpmpd
17-02-2004, 22:46
ah, il compilatore il GCC 3.2.3 :stordita: :fagiano:

pdpmpd
19-02-2004, 22:57
ehm.. era un loop infinito :stordita: risolto :D
questo il codice definitivo, funziona, se a qualcuno serve...
occhio che non controlla se i calloc vanno a buon fine :ciauz:


double Determinante(double **Matrix, int Order) {
if (Order==2) return (Matrix[0][0]*Matrix[1][1]-Matrix[0][1]*Matrix[1][0]);
else {
int cx,cy,cz,xz,sign=1;
double **Compl=(double **)calloc(Order-1,sizeof(double *));
for (cx=0; cx<Order-1; cx++) *(Compl+cx)=(double *)calloc(Order-1,sizeof(double));
double Res=0;
for (cx=0; cx<Order; cx++,sign=-sign) {
for (cy=0,xz=0; cy<Order-1;xz++)
if (xz!=cx) {
for (cz=0; cz<Order-1; cz++) Compl[cy][cz]=Matrix[xz][cz+1];
cy++;
}
Res+=Matrix[cx][0]*Determinante(Compl, Order-1)*(double) sign;
}
free(Compl);
return Res;
}
}

Loading