Newsgroup: it.comp.lang.c
Titolo: malloc preserve

Buongiorno a tutti.
Una domanda credo semplice ma non ne riesco ad uscire.
Per un'esercitazione devo utilizzare un array dinamico perchè devo
memorizzare n valori e non so a priori quanto possa valere n. Ho
pensato di usare la malloc ma pare che ad ogni uso mi "resetti"
l'array.
Esiste un metodo (anche senza malloc se fosse) per ridimensionare un
array? Se conoscee Visual Basic mi servirebbe il corrispettivo di
ReDim Preserve...
Grazie,
Al3x
PS: per questioni di programma fatto non posso usare un array di
puntatori che credo mi risolverebbe il problema...

 l'array.
Scusa, ma tu usi una funzione senza neanche sapere cosa fa ?
E' ovvio che ti "resetti" : ogni volta che la chiami la malloc
alloca una nuova area di memoria. Se  vuoi preservare
il contenuto vecchio allora devi copiare tu il contenuto nella
nuova area di memoria e fare un free della vecchia.
Oppure, piu' semplicemente puoi usare la funzione realloc()
(che devi andare a leggerti esattamente cosa fa)
che dovrebbe essere quello che serve a te.
ciao,
g.

(che devi andare a leggerti esattamente cosa fa)
Andrò a cercare, spero di poterla usare (dipende se l'hanno vista o
meno mi sa).
Ho sempre odiato le esercitazioni fini a se stesse a scuola :-)!!!
Grazie mille,
Al3x

 ottimizzato...
Forse ti sfugge un dettaglio. In C un array è una sequenza *contigua* di
elementi di un certo tipo. "Estendere" un array senza modificare la sua
posizione in memoria è possibile soltanto se esiste sufficiente memoria
utilizzabile che sia immediatamente addiacente. Diversamente, l'array dovrà
essere ricostruito altrove.
Non c'è niente di magico in 'realloc'. Poiché la sua implementazione è
interna al gestore dell'allocazione dinamica, può sfruttare quei casi in
cui la memoria seguente a un blocco restituito da 'malloc' è ancora
disponibile e utilizzabile, ma nel caso più comune 'realloc' non farà
qualcosa di diverso da quanto il programmatore dovrebbe fare "a
mano" (cioè: allocare il nuovo, copiare, e liberare il vecchio).
Se vuoi veramente ottimizzare, devi adottare qualche strategia che, a
scapito di un certo spreco di memoria, riduca il numero delle chiamate a
'malloc' allocando sempre blocchi di più estesi di quanto ti serva in quel
momento.
Max

 momento.
esattevolmente.
Grossolanamente: ti tieni 2 valori, uno che indica
quanto e' lungo il tuo array fisicamente e uno quanto e' lungo
logicamente. Quando lo devi "allungare" confronti i due
valori: se la lunghezza logica eccede quella fisica e' ora di fare
una realloc. Con che passo procedere di realloc in realloc dipende
fortemente dal tuo problema e da quanto veramente uno deve ottimizzare
le cose.
Per intenderci, se ho un array di interi a dimensione potenzialmente
variabile tra 1 e 1000 allora non ha neanche senso mettere su
un ambaradan ottimizzato: alloco 1000 interi e ciao.
Se di questi array ne devo gestire un milione
allora magari e' meglio sedersi un attimo a pensare.
(Io considererei anche l'ottimizzazione superflua un errore, perche'
dimostra che uno non e' in grado di valutare la il costo
di un algoritmo.)
In ogni caso la sorella della tua fidanzata dovrebbe
studiarsi il C e poi risolversi l'esercizio per conto suo,
altrimenti cosa ci va a fare all'universita' ?
Sicuramente l'esercitazione (che probabilmente serve
per imparare l'allocazione dinamica che e' uno dei capisaldi
del C) rimane fine a se stessa se gliela fa qualcun altro...
g.

 del C) rimane fine a se stessa se gliela fa qualcun altro...
1. Non lo sto facendo io ma la sto aiutando (la aiuterò stasera a dire
il vero ma volevo arriva pronto!). Lei aveva predetto se lo facevo ma
mi sono rifiutatissimo! Ci mancherebbe anche :-)!
2. Non può studiarsi il C adesso poichè l'esercitazione è stata data
martedì pomeriggio con consegna venerdì mattina... quindi lei l'ha
fatta da sola e poi mi ha chiesto delucidazioni...
Al3x

 mi sono rifiutatissimo! Ci mancherebbe anche :-)!
Urca! Non chiedetemi in che lingua ho scritto questa frase!
Intendevo: "Lei  mi ha chiesto se lo facevo io il porgrammino ma mi
sono rifiutato assolutamente! Va contro i miei principi (dato che sono
stato insegnante e ogni tanto mi capita ancora di fare qche corso)"
Al3x

 memorizzare n valori e non so a priori quanto possa valere n. 
Suppongo che l'array dinamico sia una sua supposizione, ma qui la cosa più
semplice è usare una lista...
-- 
NoWhereMan (e.v.)
-- 
http://www.nowhereland.it
-- 
http://flatpress.nowhereland.it

 semplice è usare una lista...
Dipende. Se poi a questi valori vuoi accedere in modo
casuale e non sequenziale la lista non va poi molto bene...
g.



certo; può anche implementare un albero...
poi bisogna vedere cosa deve fare con questi n valori...


 > casuale e non sequenziale la lista non va poi molto bene...
Molto semplice, dovrà: ordinarli, fare la somma e la media...
Quindi la lista (mia primissima idea) andrebbe benissimo...
Al3x

 Quindi la lista (mia primissima idea) andrebbe benissimo...
sort di una lista concatenata ?
E con quale algoritmo ?
g.

 E con quale algoritmo ?
allora un albero binario; visitato in ordine simmetrico dà un elenco
ordinato; per somma e media l'ordine non è importante (e comunque si
possono calcolare durante la visita).


Intanto vi ringrazio per l'aiuto. Alla fine ho fatto usare le ralloc
dopo averla studiata e spiegata motivando le ragioni dell'uso.
Giusto per la cronaca sia lo scritto che l'orale sono andati bene
direi (un 25!), grazie anche al vostro aiuto!
Al3x