Newsgroup: it.comp.lang.c
Titolo: Domanda su array

Devo creare un array che mi memorizzi un'immagine bitmap (si dice cosě,
vero?) a due colori.
Dato che verrebbe troppo grande fare una cosa del tipo: short vet[640][480]
(ho provato e mi da errore), e che devo avere dei costi di accesso e
modifica degli elementi bassissimi, come posso fare?
Perché la memoria convenzionale basterebbe, solo che con il tipo short ogni
elemento mi occupa un byte (occupa un byte, no?), mentre a me basterebbe
soltanto un bit.
Le soluzioni a cui stavo pensando erano queste: mettere l'array nella
memoria alta, creando un puntantore (ma non so quasi nulla di puntatori,
forse sto dicendo una cavolata!), oppure utilizzare per intero il byte del
tipo short, codificando nel byte una linea di 1*8 pixel... in fondo il
numero da 0 a 255 del byte di tipo short si puň trasformare in un binario,
dove ogni 1 o 0 rappresenterebbe un pixel... ma questo poi mi alza i costi
di modifica e di accesso forse, i conti di preciso li devo ancora fare su
quest'ultima ipotesi!
Ci sono altre soluzioni? Oppure, quale delle due č la piů conveniente?
Grazie!
Roger

soltanto un bit.
Dato che, generalmente, 1 byte e' di 8 bit e un char e' sempre di
dimensione 1 byte, la soluzione maggiormente portabile e piu'
conveniente e' :
unsigned char bitmap[480][80] ;
Con una occupazione totale gestibilissima di 38400 byte.
--
Andrea Laforgia
andrea_...@bigfoot.com

 wrote in message
38793b59...@diesel.cu.mi.it...


programma...
No, aspetta, voglio dire esattamente 480x80 cioe' 38400.
In C il primo indice indica generalmente le righe e il secondo le
colonne, per cui la conformazione dello schermo corrisponde a 480x640.
Ora, dato che le immagini da memorizzare, servendo un bit solo, sono
monocromatiche, il fattore 8 di differenza e' giustificato per le
ascisse, in quanto un solo unsigned char rappresenta 8 pixel
consecutivi.
--
Andrea Laforgia
andrea_...@bigfoot.com

 programma...
Non sono sicuro, ma non so se il dos ti faccia allocare nello stack
300K in questo modo,mi sembrano un po' troppi, meglio usare lo heap
allocando la matrice dinamicamente con una malloc.
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it


Secondo me dato che per rappresentare 2 colori e' sufficiente un
bit(0=nero;1=bianco)
un unsigned char ti puo' rappresentare 8 pixel.
quindi 640 pixel * 480pixel in 2 colori si possono rappresentare cosi':
unsigend char BitMap[80][60] (4800 bytes) , pero' dovrai preoccuparti di crare
delle maschere di bit,per una + facile gestione.
Ivan Molella
--
Posted from 
mta09-acc.tin.it
 [212.216.176.40]
via Mailgate.ORG Server - 
http://www.mailgate.org

Ops! Mi Correggo, errore imperdonabile,e' come dice Laforgia.


sopravvaluto ;-)
Esatto :) la sopravvalutazione, in effetti, c'e' ed e' in quell'
"esimio" ! ;)
--
Andrea Laforgia
andrea_...@bigfoot.com

Ok, Ok, ho detto una boiata.... il problema č che probailmente non sarą
l'ultima....
Portate pazienza!
Marco

 wrote in message
3860158...@diesel.cu.mi.it...


 il bit e risalvare il char al suo posto.
Corvertirlo in binario????
Perchè, che computer usi tu? Io ho un PC che lavora escusivamente in
binario, per cui non mi serve nessuna conversione.
Semmai ti servono gli shift:
Indirizzare il byte:
B = X>>3
Indirizzare il bit:
b = X & (!7);
(Ponendo X la ordinata del pixel, mentre Y rimane uguale)
Queste istruzioni richiedono 1 o 2 instruzioni assembler, con pochissimi
cicli di clock.
--
Alessandro Monti

dell' elemento matrice[19][23] ?
#define bit_peek( n, i )    ( ((n) >> (i)) & 1 )
#define bit_set( n, i )     { n |= (1 << (i)) ; }
#define bit_reset( n, i )   { n &= (~(1 << (i))) ; }
...
Lo vuoi azzerare ?
bit_reset( matrice[19][23], 3 ) ;
Lo vuoi mettere a 1 ?
bit_set( matrice[19][23], 3 ) ;
--
Andrea Laforgia
andrea_...@bigfoot.com