Newsgroup: it.comp.lang.c
Titolo: array con numero variabile di elementi

ciao,
ho un array di int che ho allocato dinamicamente con malloc() sulla
base del numero massimo di elementi che può contenere. Dopo la
creazione l'ho inizializzato con tutti valori 0.
Dalle successive operazioni di calcolo l'array mi si riempie con un
numero di  valori che non posso conoscere a priori (comunque sempre
inferiori al numero massimo di elementi che può contenere) ma ciò non
mi crea problemi perchè considero zero come indicatore di fine riga.
Il problema mi si pone quando vado ad ordinare in quanto ottengo un
array con una serie di 0 e poi i valori che devo elaborare. Come posso
evitare questo? Avete qualche suggerimento da darmi?
Grazie e spero di essere stato chiaro.
geo

 evitare questo? Avete qualche suggerimento da darmi?
Non puoi ordinare solo la parte che sai essere piena di valori validi?
Pleg


Giusto, anche se preferirei evitare di arricchire la funzione di
ulteriori scritture di controllo (ne ho messe fin troppe!)
geo

 array con una serie di 0 e poi i valori che devo elaborare.
A mio parere, 2 possibili soluzioni:
1) quando inserisci nuovi valori, scrivi comunque tutti i valori
dell'array, impostando a 0 quelli non definiti volta per volta. In
questo modo, ti troverai sempre degli 0 dopo lìordinamento, ma gli
altri dati non saranno più 'sporcati' da valori preesistenti. Lo
svantaggio di questa soluzione è che scriverai SEMPRE n valori (n =
lunghezza dell'array), il che porta a problemi di performance se n è
molto grande
2) tieni da qualche parte il numero di valori inseriti l'ultima volta,
così quando vai ad ordinare, operi solo su quei valori e non su tutto
l'array. Soluzione più efficiente in termini di prestazioni, ma ti
serve una variabile esterna.
Spero di aver capito il problema ;-)
Ciao

 ulteriori scritture di controllo (ne ho messe fin troppe!)
Che controllo? Basta che ti tieni una variabile "int length" che tiene traccia man mano del numero di slot occupati, e la passi alla funzione di ordinamento.
Un int in piu' non costa niente...
Pleg


lo credevo pure io, prima di avere a che fare con un
microcontrollore... :D Sto scrivendo a suon di campi
di bit!
-- 
Computer multitasking: oggetto che
può essere messo fuori uso da più
persone contemporaneamente.

 di bit!
E fai anche ordinamento di array, sul micro? :)
Pleg

geonomos ha scritto:

Ma quella che ti viene suggerita e' LA soluzione. Invece di mantenere 
uno zero in fondo all'array (che comunque ti costa un valore in più), 
mantieni la lunghezza dell'array. Questa soluzione ti porta solo vantaggi.
E.


Ho questo problema e sto studiando come fare. Sono
indeciso tra un vero ordinamento e
un'indicizzazione. Si tratta di una ventina di
elementi quindi dal punto di vista della velocità
rispetto a quel che mi serve è indifferente, ma con
quegli spazi ultra-ristretti proverò entrambe le
soluzioni e la risposta la darà il compilatore con
le percentuali di RAM e Flash occupate... :/



Usare INT_MAX invece dello zero come fine riga? :-)
Ciao!

FtM ha scritto:

Oppure modificare l'operatore di confronto perché lo zero risulti 
maggiore degli altri interi. Però comunque devi riempire tutte le 
caselle non utilizzate.
E.


eheh, la mia voleva essere più una battuta che un'idea. Ovviamente
l'unica soluzione "decente" è quella di ordinare solo l'ordinabile.
Ciao!

 le percentuali di RAM e Flash occupate... :/
oppure inserisci gia' nel posto giusto, cosi poi non devi ordinare.
cmq io eviterei di usare la malloc su un micro, se hai gia' problemi
(di spazio) a istanziare un unsigned int in piu' per tenere la
lunghezza dell'array...
Ciao Jack

 dell'array...
L'array di records è di lunghezza fissa e al massimo
può avere 12 elementi. Uno dei campi è chiave di
ordinamento, ed è previsto un accesso massiccio
perché quell'array è uno dei cardini del programma.
Non vedo altro oltre ordinamento o indicizzazione
proprio per evitare la memoria dinamica. E credo che
l'unica sarà provare le due soluzioni e vedere nel
contesto di tutto il programma se favorire la flash
con un programma più ridotto a scapito della RAM o
viceversa.
ciao!
Apx.
