PDA

Visualizza la versione completa : problema della memoria in C


Simona82
17-11-2008, 11:30
Vi inserisco parte del codice di un programma....mi crea problemi di memoria ma non riesco a trovare l'errore.Spero che qualcuno possa darmi una mano.

Nel programma alloco dinamicamente memoria per una matrice che inizializzo (matrici quadrate simmetriche).....Dopo di che lo scopo del programma è fare degli unioni, passare quindi, per es, da una matrice 5x5 ad una 4x4 e così via fino ad arrivare ad una matrice1x1. Ovviamente una volta creata la matrice 4x4 è possibile cancellare quella 5x5 per evitare spreco di memoria......Vi inserisco il codice. Per tutti i dubbi contattatemi. Grazie già da ora.


ALLOCAZIONE



adiacenze=(int **)malloc(numerorighe*sizeof(int*));
for (i=0;i<numerorighe<i++)
adiacenze[i]=(int *)malloc(numerorighe*sizeof(int));


INIZIALIZZAZIONE



.....
for (i=0;i<nr;i++)
for (j=0;j<=i;j++)
...................


CREAZIONE MATRICI (stando in un ciclo, mi creo la nuova matrice, libero lo spazio di memoria occupato dalla vecchia matrice, mi alloco spazio di memoria della grandezza della nuova matrice e copio i valori della nuova matrice nelo spazio di memoria allocato......non so se fila: tutto per uan questione di nomi)



.........
nuova_adiacenze=(int **)malloc(n*sizeof(int));
for (i=0;i<n;i++)
nuova_adiacenze[i]=(int *)malloc(n*sizeof(int));
..........
for (i=0;i<n;i++)
free(adiacenze[i]);
free(adiacenze);
adiacenze=(int **)malloc(n*sizeof(int));
for (i=0;i<n;i++)
adiacenze[i]=(int *)malloc(n*sizeof(int));
adiacenze=nuova_adiacenze;
for (i=0;i<n;i++)
free(nuova_adiacenze[i]);
free(nuova_adiacenze);



vi prego aiutatemi

oregon
17-11-2008, 11:32
Includi il codice tra i tag CODE altrimenti e' illeggibile ... e dai un'occhiata al regolamento prima di postare ...

In ogni caso, questa for e' strana ...

for (i=0;i<numerorighe<i++)

Simona82
17-11-2008, 11:54
ALLOCAZIONE



adiacenze=(int **)malloc(numerorighe*sizeof(int*));
for (i=0;i<numerorighe;i++)
adiacenze[i]=(int *)malloc(numerorighe*sizeof(int));



INIZIALIZZAZIONE



.....
for (i=0;i<nr;i++)
for (j=0;j<=i;j++)
...................



CREAZIONE MATRICI (stando in un ciclo, mi creo la nuova matrice, libero lo spazio di memoria occupato dalla vecchia matrice, mi alloco spazio di memoria della grandezza della nuova matrice e copio i valori della nuova matrice nelo spazio di memoria allocato......non so se fila: tutto per uan questione di nomi)



.........
nuova_adiacenze=(int **)malloc(n*sizeof(int*));
for (i=0;i<n;i++)
nuova_adiacenze[i]=(int *)malloc(n*sizeof(int));
..........
for (i=0;i<n;i++)
free(adiacenze[i]);
free(adiacenze);

adiacenze=(int **)malloc(n*sizeof(int*));
for (i=0;i<n;i++)
adiacenze[i]=(int *)malloc(n*sizeof(int));

adiacenze=nuova_adiacenze;

for (i=0;i<n;i++)
free(nuova_adiacenze[i]);
free(nuova_adiacenze);




scusa.....cmq per il for è solo un errore di scrittura.....non è quello il problema. grazie

oregon
17-11-2008, 11:56
Ok ... ma per evitare di copiare e provare TUTTO il codice, non potresti dire quale errore hai e in quale punto del programma (piu' o meno ...)?

Simona82
17-11-2008, 12:34
la parte creazioni matrici è un cilco......la prima volta che entro è ok ma già dalla seconda iterazione adiacenze=nuova_adiacenze non funziona......ho inserito il codice perchè non so se possa essere solo una questione di indici.

oregon
17-11-2008, 12:40
Questa

adiacenze=nuova_adiacenze;

e' sbagliata (logicamente) perche' cosi' perdi il riferimento alla matrice adiacenze che hai allocato ...

Quali sono i passi logici che vuoi compiere nel ciclo? Ad esempio

Creazione nuova matrice

Copia della vecchia matrice nella nuova

Eliminazione della vecchia matrice

e soprattutto perche' ? Mi manchera' qualche informazione ma perche' creare una nuova matrice e copiarci quella vecchia ... ? Non puoi usare la vecchia ?

Simona82
17-11-2008, 15:20
Ti faccio un esempio pratico così magari è più facile da capire.

PARTO DA UNA MATRICE 5X5 ADIACENZE

NEL CICLO:
- CREO UNA MATRICE NUOVA-ADIACENZE 4X4 UTILIZZANDO I VALORI DI QUELLA 5X5
- DEALOCCO LO SPAZIO DI MEMORIA DI QUELLA 5X5 MATRICE ADIACENZE
- RICREO LA MATRICE COL NOME ADIACENZE MA CHE OCCUPA UNO SPAZIO DI MEMORIA UGUALE A QUELLO DELL MATRICE 4X4 (NON PIU' 5X5)
- COPIO LA MATRICE NUOVA ADIACENZE NELLA MATRICE ADIACENZE
- DEALLOCO LA MATRICE NUOVA-ADIACENZE

E COSì VIA FINO AD OTTENERE UNA MATRICE 1X1

LO SCOPO DELLE VARIE UNIONI E' TROVARE UN CLUSTER OTTIMALE IN BASE AGLI INDICI E AI VALORI CONTENUTI NELLE MATRICI CHE MEMORIZZO DI VOLTA IN VOLTA. QUESTO E' SOLO UNA PARTE DEL PROGRAMMA. OVVIAMENTE PER POTER UTILIZZARE IL CICLO I NOMI DELLE MATRICI NON DEVONO CAMBIARE MA DEVO CAMBIARE LA LORO GRANDEZZA OGNI VOLTA.NON SO SE MI SONO FATTA CAPIRE :master:

king64
17-11-2008, 17:35
Non capisco tutto questo allocare/deallocare. Utilizza due matrici di 5x5, di cui una di appoggio temporaneo, e alla fine deallochi il tutto. Saluti :ciauz:

Loading