Newsgroup: it.comp.lang.c
Titolo: allocazione di un array bidimensionale all'interno di una funzione

salve,
innanzitutto mi scuso, so che l'argomento è trito e ritrito ma non ne 
riesco a venire fuori...
allora, sto cercando di scrivere una funzione che carichi una matrice da 
un file di testo, ovviamente non posso sapere a priori la dimensione 
della matrice so solo che sarà una matrice quadrata:
int leggiMatrice(char *nomefile,double **A,double *vet){
     FILE *inFile;
     double temp;
     int dimMatrice,nElemen=0;
     double *tempMatrix=NULL;
     int i,j,current=0;
     A=NULL;
/*lettura dal file di testo*/
     inFile=fopen(nomefile,"r+");
     while(fscanf(inFile,"%lf",&temp)!=EOF){
 
if((tempMatrix=realloc(tempMatrix,(nElemen+1)*sizeof(double)))==NULL){
            perror("Allocazione vettore di supporto:");
            exit(1);
        }
         tempMatrix[nElemen]=temp;
         nElemen++;
     }
/*fine lettura*/
//calcolo la dimensione della matrice
     dimMatrice=(int)sqrt(nElemen);
     if((A=calloc(dimMatrice,sizeof(double*)))==NULL){
         perror("Allocazione puntatori alle righe della matrice:");
         exit(1);
     }
     if((vet=calloc(dimMatrice,sizeof(double)))==NULL){
         perror("Allocazione vettore dei termini noti:");
         exit(1);
     }
/*copio quanto letto dal file nella matrice e nel vettore dei termini noti*/
     for(i=0;i<dimMatrice;i++){
         if((A[i]=calloc(dimMatrice,sizeof(double)))==NULL){
                 perror("Allocazione riga:");
                 exit(1);
         }
         for(j=0;j<dimMatrice;j++){
             A[i][j]=tempMatrix[current++];
         }
       vet[i]=tempMatrix[current++];
     }
     /*stampo a video il contenuto della matrice*/
   for(i=0;i<dimMatrice;i++){
         for(j=0;j<dimMatrice;j++){
             printf("A[%d][%d]:%f\t",i,j,A[i][j]);
         }
printf("vet[%d]:%f\n",i,vet[i]);
     }
     /*ritorno la dimensione della matrice*/
     return dimMatrice;
}
e nel main dichiaro
double **A,*vet;
e richiamo con:
leggiMatrice(A,vet);
ma a questo punto (dal main) non accedo alla matrice e il programma va 
allegramente in buserror (che dovrebbe essere (credo) l'equivalente di 
un seg fault)
credo dovrei aggiungere un ulteriore livello di indirezione e 
trasformare la funzione in:
int leggiMatrice(char *nomefile,double ***A,double **vet)
ma mi sto perdendo col puntatore al puntatore al puntatore....
grazie in anticipo a tutti

 un seg fault)
non sara' che la dimensione di una matrice quadrata e'
nElemen*nElemen
e non 
sqrt(nElemen)
?
HTH
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
-- 
gx
jah say love your enemy

 ma mi sto perdendo col puntatore al puntatore al puntatore....
O cosi` (utilizzando magari qualche variabile temporanea), oppure
modifichi il prototipo in modo che restituisca le due matrici. Nel primo
caso:
int leggiMatrice(char *nomefile,double ***A,double **vet) {
        double **A_temp, **vett_temp;
        A_temp = calloc(...);
        vett_temp = calloc(...);
        ...
        *A = A_temp;
        *vett = vett_temp;
}
Nel secondo:
struct mystruct {
        double **A;
        double **vett;
};
struct mystruct *leggiMatrice(char *nomefile) {
        struct mystruct *ret;
        ret = malloc(...);
        ret->A = calloc(...);
        ret->vett = calloc(...);
        return ret;
}
IMHO la seconda forma e` piu` chiara quando la funzione deve allocare
dinamicamente qualcosa, me e` questione di gusti.
Luca
-- 
Home: 
http://kronoz.cjb.net
Non sempre quello che viene dopo e` progresso.
Alessandro Manzoni


wua grazie, avevo giŕ provato con il primo metodo che consigli ma avevo 
sbagliato qlc, ora funziona :)
