PDA

Visualizza la versione completa : [C] diminuire dimensione locazione di memoria


Devour
28-12-2012, 15:47
Ciao,

ho questa area di memoria:


lista_item= calloc(itemtotali,sizeof(int));

dovendo eliminare un elemento al suo interno, dovrei ridimensionarla e fare in modo di non perdere gli altri elementi..

pensavo di usare realloc, ma poi come posso fare per riscrivere all'interno della nuova area gli altri elementi rimasti?

grazie..

MItaly
28-12-2012, 15:55
Devi rimuovere un elemento in qualunque posizione dell'array? In tal caso:
- se è l'ultimo elemento non c'è alcun problema - chiama la realloc e fine;
- se è un elemento centrale, "sposta" in blocco gli elementi che lo seguono sizeof(int) bytes prima (usa la memmove), e quindi usa la realloc.

Devour
28-12-2012, 15:57
ok, provo :)

Devour
28-12-2012, 16:23
scusami, ma non riesco a capire come individuare il punto in cui è stato eliminato l'elemento..cioè io dovrei fare

memmove( destinazione, origine, sizeof(int))

ma origine e destinazione come le trovo?

MItaly
28-12-2012, 16:27
Se devi eliminare l'i-esimo elemento devi spostare tutti gli elementi dall'i+1 all'ultimo di un "passo" indietro...

Devour
28-12-2012, 16:32
si si quello l'ho capito... mi sono spiegato male prima...praticamente io conosco l'item cancellato, ma non la sua posizione all'interno di lista_item, quindi volendo posso fare cosi?



/*conosco item*/
for(i=0;i<dimensionelista;i++) {
if(lista_item[i]==item)
memmove(lista_item[i],lista_item[i+1],sizeof(int));
}

lista_item=realloc(lista_item, (dimensionelista-1)*sizeof(int))

oregon
28-12-2012, 16:35
Devi conoscere la posizione perché stai parlando di un valore numerico intero che potrebbe stare ovunque.

Per capirci, se elimini un 5, con quel tuo codice trovi la posizione del primo 5 che incontra ma non quello che sicuramente cerchi.

Devour
28-12-2012, 16:36
se i numeri nella lista però sono tutti diversi tra loro va bene, giusto?

oregon
28-12-2012, 16:37
Ovviamente sì.

Devour
28-12-2012, 16:38
ok, allora a posto...grazie!

Loading