Newsgroup: it.comp.lang.c
Titolo: passaggio e realloc()

sono nuova e spero di non infrangere la netiquette che ancora devo
leggermi :°
ho bisogno di un consiglio. Io vorrei fare questo:
main (..){
   ...
   pippo=funzione(...);  //pippo è un int
   ...
}
int funzione (...){
    int contF=0; contD=0;
    contF=funzione2(...);  
   while{
 
      ....
      contD=funzione1(...);
      row++;
      cont=funzione3(contF, contD, row);
      ...
   }
return 0;
}
int funzione3(int contF, int contD, int row)
{
   static double dfitf[contD][contF];
   var[contD];
   somma[contF];
   //eseguo calcoli
return 0;
}
il problema è nella funzione3 infatti mi dà errore nella creazione di
dfitf in quanto si aspetta, per dimensionarlo, un'espressione costante. 
ingenuamente ho provato in questo modo:
int funzione3 (const int contF, const int contD, int row){...}
ma nn va bene lo stesso.. la soluzione più semplice sarebbe che io
dichiarassi dfitf[1000][1000] e così anche i vettori ma non mi piace visto
che le dimensioni reali (senza sprechi di memoria) le ho (cioè contD
contF).
la soluzione consigliatami, senza spiegarmi come, è usare la realloc in
questo modo:
int funzione (...){
    int contF=0; contD=0;
    static double dfitf [1][1];  //qui dichiaro la mia matrice
    ...                         //dichiaro anche i vettori
    contF=funzione2(...);  
   while{
 
      ....
      contD=funzione1(...);
      row++;
      cont=funzione3(**dfitf, *var, *somma, contF, contD, row); //è giusto
                                   //un puntatore a puntatore?? e due 
                                   //puntatori semplici?
      ...
   }
return 0;
}
int funzione3(double *dfitf, double var, double somma, int contF, int
contD, int row)
{
   dfitf=(double *)realloc(dfitf,????);
   //eseguo calcoli
return 0;
}
so che un puntatore è una "struttura lineare", quindi se non sbaglio se la
mia matrice è dfitf[3][290] mi immagino un puntatore lungo 290*3 quindi la
mia realloc dovrebbe essere dfitf=(double*)realloc(dfitf, 290*3)??
scusate ho un vero casino in testa coi puntatori e non solo.
Sara
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 }
 mi č venuto in mente che potrei fare solo una malloc, ma a questo punto
ho una gran confusione dove la faccio? visto che questa "benedetta"
matrice mi servirą che sia static?
pensavo alla malloc perchč prima di richiamare la funzione3 so gią come
dimensionare la matrice perciņ potrei fare
dfitf=(double*)malloc(contD*contF)
č giusto?


 dfitf=(double*)malloc(contD*contF)
Dichiarandola esternamente puoi allocarla nei due modi descritti sopra:
double *dfift = malloc(contD * contF * sizeof(float));
funzione3(dfift, ....);
free(dfift);
oppure:
double **dfift = malloc(condD * sizeof(float *));
/* etc */
funzione3(dfift, ....);
for (i = 0; i < contD; i++)
        free(dfift[i])
free(dfift);
Nota che nei due casi il prototipo di funzione3 sara` diverso, ed
all'interno della funzione dovrai usare lo spazio allocato in modo
diverso (nel primo caso usando dfift[x * contD + y], nel secondo usando
la notazione degli array bi-di dfift[x][y]).
Luca
-- 
Home: 
http://kronoz.cjb.net
Non sempre quello che viene dopo e` progresso.
Alessandro Manzoni

 }
ora provo a scrivere ciò che mi hai consigliato sopra e.. speriamo!
intanto grazie mille!


 suoi risultati, basta semplicemente un static, giusto?
No. Se fosse allocata automaticamente andrebbe bene static, ma in questo
caso la memoria viene allocata con malloc. Se togliessi le free() in
fondo alla funzione la matrice resterebbe valida, ma non avresti piu` il
puntatore con cui accedervi (e avresti anche un leak).
Non ho ben capito cosa vorresti fare, dal tuo codice sembrava di capire
che ogni chiamata a funzione3 operasse su una matrice differente. Se
chiamate successive alla funzione devono operare sulla stessa matrice ti
conviene allocarla prima della chiamata, passarla alla funzione e
deallocarla quando non ti serve piu`.
Luca
-- 
Home: 
http://kronoz.cjb.net
"L'ottimista pensa che questo sia il migliore dei mondi possibili. 
 Il pessimista sa che e` vero" -- J. Robert Oppenheimer

 Luca
Fa parte del progetto della mia tesi che "elabora" dei documenti, ed ogni
documento (ciclati in una funzione) deve "riscrivere" quella matrice.
Comunque ti ringrazio ancora per il tuo aiuto ma, alla fine, la mia prof
mi ha detto che non era necessario che io utilizzassi questa matrice ma un
tipo di dato creato da lei che sia chiama CNFloatVector ed è una cosa
carina perchè si alloca dinamicamente ed automaticamente ad ogni
inserimento, grazie mille lo stesso perchè mi hai chiarito parecchi dubbi
che, prima o poi, si ripresenteranno.
