Newsgroup: it.comp.lang.c
Titolo: Array 2D...

Scusate se la domanda e' molto newbye : ho la necessita' di manipolare
delle matrici e passarle tra subroutine... Ho scritto questi frammenti di
codice (Uso Linux mdk 7.1 con gcc... l'ultima stable, non ricordo !) :
double **m_alloc(int r,int c) {
	register i;
	double **m;
	m = (double **)malloc(r*sizeof(double *));
	for (i=0;i <= r;i++) m[i]=(double *)malloc(c*sizeof(double));
	return m;
	}
e la corrispondente
void m_free(double **m,int r) {
	register i;
	for (i=0;i <= r;i++) free(m[i]);
	}
. Ora : per semplicita' di chiamate (alcue subroutine hanno 8 parametri
:-<) ho tre matrici "globali" che vengono allocate allo startup e liberate
alla fine del prg. Il resto del programma alloca e dealloca varie matrici
durante i suoi dannati calcoli. Ho controllato (numerandole !) che tutte
le matrici allocate fossero deallocate, ma occasionalmente la routine
m_free effettua un SIGSEGV. Mi chiedevo (a casa ho solo il k&r prima
edizione ma attualmente e' in "prestito" e non posso consultarlo...) se la
routine che uso per deallocare la memoria sia corretta ! Scusate il post
Kilometrico e grazie a chi volesse aiutarmi,
|~~~~~~| 
|(O>   |\  Fabio Cavaliere (Homebrew apprentice & GLUG member)
|//\   | | e-mail > 
fa...@urania.fisica.unige.it
|V_/_  | | e-mail2 > 
cava...@server3.fisica.unige.it
|######|-  GLUG on the Web : 
http://genova.linux.it
 
+------+

m_free effettua un SIGSEGV.
Perfettamente normale: quando sconfini il comportamento e'
pseudo casuale...
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 routine che uso per deallocare la memoria sia corretta !
Hai allocato un array di puntatori, ognuno dei quali punta ad un array di
double.
Nella routine di deallocazione deallochi ognuno di questi array,
correttamente, solo che poi rimane allocato l'array dinamico di puntatori.
Aggiungi, dopo il ciclo, free( m ); , che alloca la memoria puntata dal
puntatore a puntatore a double m.
Il tuo nick mi ricorda qualcosa. Forse un personaggio della saga di
Dragonlance...
--
Marco Iannaccone     
marc...@tin.it
ICQ: 18748121           Tolkien
"I've... seen things you people wouldn't believe. Attack ships on fire off
the shoulder of Orion.
I watched C-beams... glitter in the dark near the Tanhauser Gate. All
those... moments will be lost... in time..., like... tears... in... rain."
FAQ it.comp.lang.c++: 
http://www.programmazione.it/linguaggi/c/lang_faq.htm
FAQ it.comp.lang.c: 
http://www.programmazione.it/linguaggi/c/itcomplangc.htm

	}
Mancherebbe un free(m); ma questo NON puo' causare un SIGSEGV ....

 avevi allocato solo r puntatori.
for( i=0; i<r; i++) .....
Rimane la deallocazione dell'array di puntatori...


Rimane la deallocazione dell'array di puntatori...
Mi era sfuggita. Comunque quella non puo' essere la causa di
comportamenti bizzarri.


 comportamenti bizzarri.
Infatti... A me, dato che Tasslehof chiedeva se la funzione di deallocazione
funzionava bene, era sfufito il primo problema, dato che non ho guardato la
prima funzione... :-)


 
Perdono a tutti ! Mi sono accorto da solo del problema (era tutto
nell'r+1, solo che il SIGSEGV lo avevo al primo free e non all'ultimo : mi
fidavo troppo del codice per rileggerlo) e ora almeno questo funziona.
Certo, se l'algoritmo convergesse sarebbe un'altro paio di maniche ma non
posso volere tutto dalla vita :-) Grazie a tutti per l'aiuto,


 
Veramente vero, se capisci cosa intendo :-)
