Newsgroup: it.comp.lang.c
Titolo: conversione area di memoria

ciao a tutti...ho allocato dinamicamente un'area di memoria nel seguente
modo:
int main(){
....
char *data_ptr; //puntatore ai dati binari
int len; //numero di bit
....
data_ptr=malloc(len*sizeof(char));
....
}
ovvero data_ptr punta ad un'area in cui memorizzo come char una serie di
dati binari (ho scelto il char in modo da 'sprecare' meno bit possibile
visto che ogni valore *(data+i) per i=0...len-1 può valere solo o 0 oppure
1. L'area di memoria me la porto dietro per una serie di elaborazioni, ad un
certo punto però i bit vengono mappati su dei livelli logici +/- 1/sqrt(2)
pertanto non posso + utilizzare il tipo char e devo passare ai double. La
mia idea era quella di allocare una nuova area grossa len*sizeof(double) e
poi copiare uno a uno i valori da un'area all'altra, a questo punto i bit 0
e 1 sono rappresentati come double e posso mapparli su +/- 1/sqrt(2). Non
avete qualche suggerimento per fare la conversione in maniera magari + furba
ed efficiente senza dover allocare una nuova area di memoria? io pensavo ad
una riallocazione dell'area puntata da data_ptr però poi non so come
eseguire la conversione...sicuramente avrei potuto partire direttamente con
i dati in double però mi sembrava + efficiente rappresentarli fin che potevo
sul minor numero di bit possibile. Grazie a chi vorrà/saprà darmi qualche
consiglio...
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


non riesco bene a capire il problema...
(fra parentesi: sizeof(char) e' inutile perche' per definizione
la dimensione di un char e' 1.)
Se il valore len e' relativamente piccolo (tipo 100000) allora
puoi infischiartene dello spreco di memoria, a meno che tu non
stia lavorando su un sistema embedded con i bytes contati.
In ogni caso dopo aver creato il vettore di double puoi sempre fare una
free del vettore di char e almeno quella memoria le recuperi.
Con un sistema un attimo piu' complicato potresti usare solo
un vettore di double e mapparci dentro i char che ti servono:
devi solo stare attento a dove li metti in modo che
durante la conversione non li sovrascrivi...
In ogni caso non mi e' chiaro il discorso della conversione
in double: dopo diventano solo valori +/ 0.707... oppure
anche altri valori ?
Perche', come dicevo, se len e' piccolo non ci sono problemi
a fare due allocazioni, mentre se len e' grande, ma i double
assumono comunque solo due valori, allora puoi proprio
evitare di usare un vettore di double:
semplicemente hai un vettore di due valori
double X[2]={-0.707..., 0.707...};
e poi invece di convertire il vettore di char C[0...(len-1)], lo
usi come indice: X[C[i]] etc.etc.
comunque, alla fin fine, tutto secondo me dipende da quanto
e' grande len e se vale o meno la pena di rompersi la testa
per risparmiare len bytes. Anche perche' magari il risparmio
in bytes si traduce in un programma meno efficiente dal
punto di vista del calcolo.
ciao,
g.

 sul minor numero di bit possibile. 
Mah... in effetti non è chiaro perché tu voglia fare così.
E.

 ...
Quanto mai! Non sei obbligato affatto ad usare 
dei double (o float o long double) per rappresentare 
valori irrazionali. Ad esempio:
1) Rappresentare questi irrazionali quadratici con
   una coppia di interi (es. (a,b) sta per a + b * 
   sqrt(0,5))
2) Noi usiamo la notazione decimale, i computer 
   di solito usano la notazione binaria; perche tu 
   non puoi usare per base 2^0,5? 
   Le basi di rappresentazione possono essere anche 
   numeri irrazionali, lo sai?
PS quando intendi "più" e "meno" scrivi "più" e "meno"
ed usa i simbolo aritmetici solo nelle formule matematiche.

 ptr=realloc(ptr,len*sizeof(double));
La sintassi ? ok, ma il caso di fallimento della realloc hai un memory
leak. Meglio:
newptr = realloc(ptr, len * sizeof(double));
if (!newptr) {
        /* out of memory, ma i vecchi dati sono ancora disponibili */
        save_old_stuff(ptr);
        free(ptr);
}
/* ok */
ptr = newptr;
Luca
-- 
"Perch? ? cos? che ti frega, la vita. Ti piglia quando hai ancora l'anima
 addormentata e ti semina dentro un'immagine, o un odore, o un suono che
 poi non te lo togli pi?. E quella l? era la felicit?."

grazie a tutti per i vostri consigli sono riuscito a fare la conversione che
mi serviva...i dati che devo maneggiare sono piuttosto voluminosi per questo
pensavo di rappresentarli come char fin che potevo
