PDA

Visualizza la versione completa : [C] Caricamento di matrice statica con tipo unsigned char


awè
04-05-2007, 11:05
vorrei capire il caricamento di una matrice di tipo unsigned char
io mi sono comportato nel seguente modo....

#include <stdio.h>
#define righe 16
#define colonne 16

void carica_matrice (unsigned char (*)[colonne], int, int);

void main()
{
unsigned char MLG [righe][colonne];
int r, c;

printf ("Quante righe: ");
scanf ("%d", %r);

printf ("Quante colonne: ");
scanf ("%d", %c);

carica_matrice (MLG, r, c);
}

void carica_matrice (unsigned char (*mat)[colonne], int R, int C)
{
int i, j;

for (i=0; i<R; i++)
{
for (j=0; j<C; j++)
{
do
{
printf ("\nInserisci valore compreso nell'intervallo [0, 255], in posizione [%d][%d]: ", i, j);
scanf ("%c", &mat[i][j]);
}while (mat[i][j] >= 255 || mat[i][j] <= 0);
}
}
}

poi quando mando in esecuzione il programma, nel caso in cui dovessi inserire un valore maggiore di 255, il controllo del while non viene rispettato e quindi va avanti con l'inserimento dei valori.....

oregon
04-05-2007, 11:09
Un unsigned char non puo' andare oltre il valore 255 (altrimenti non sarebbe un char) ne' essere minore di 0 (altrimenti non sarebbe unsigned ) ...

Il range dell'unsigned char e' 0...255

awè
04-05-2007, 11:29
capito!!! quindi il ciclo while dovrebbe essere così, o mi sbaglio?

void carica_matrice (unsigned char (*mat)[colonne], int R, int C)
{
int i, j;

for (i=0; i<R; i++)
{
for (j=0; j<C; j++)
{
do
{
printf ("\nInserisci valore compreso nell'intervallo [0, 255], in posizione [%d][%d]: ", i, j);
scanf ("%c", &mat[i][j]);
}while (mat[i][j] <= 255 || mat[i][j] >= 0);
}
}
}

poi, per quanto riguarda l'inserimento è corretto, la stringa di controllo %c è adeguata?
perchè quando vado a stampare a video la matrice che ho caricato, non mi vengono tutti i valori interi che ho inserito ma solo le prime cifre.....
per esempio se ho inserito in input il valore 129, quando stampo la matrice mi esce nell'i_esima posizione in cui ho inserito il valore, solo 1 e no 129!!!!!

oregon
04-05-2007, 12:18
No ... forse non mi sono spiegato ...

Quando fai l'input con

scanf ("%c", &mat[i][j]);

stai acquisendo il dato in formato carattere ... verra' quindi accettato un carattere qualsiasi come

A
!
?
B

Se tu vuoi lavorare (come credo) con i valori ASCII, inserendo quindi

65
66
159

allora e' meglio che utilizzi la riga

scanf ("%u", &mat[i][j]);

anche nella eventuale printf che ti servira' per visualizzare tali valori

printf("%u", mat[i][j]);

Pero', visto che su un dato di tipo unsigned char non potrai mai fare i controlli che vuoi (dato che i valori oltre il range non potranno mai essere contenuti negli elementi del vettore), il ciclo non ha senso di esistere ... quindi potrai scrivere



void carica_matrice (unsigned char (*mat)[colonne], int R, int C)
{
int i, j;

for (i=0; i<R; i++)
for (j=0; j<C; j++)
{
printf ("\nInserisci valore compreso nell'intervallo [0, 255], in posizione [%d][%d]: ", i, j);
scanf ("%u", &mat[i][j]);
}
}


Se i controllo e' necessario, allora dovrai fare l'input in una variabile temporanea di capacita' maggiore (diciamo un unsigned long), controllare che il suo valore sia nel range 0...255 e assegnare il suo contenuto all'elemento dell'array. Ovvero



void carica_matrice (unsigned char (*mat)[colonne], int R, int C)
{
int i, j;
unsigned int t;

for (i=0; i<R; i++)
for (j=0; j<C; j++)
do
{
printf ("\nInserisci valore compreso nell'intervallo [0, 255], in posizione [%d][%d]: ", i, j);
scanf ("%u", &t);
mat[i][j] = (unsigned char)t;
} while (t < 0 || t > 255);
}


Dovrai togliere dal confronto anche i segni di eguaglianza perche' i valori 0 e 255 sono leciti ...

awè
04-05-2007, 12:32
ok..... grazie mille.... 6 stato molto esauriente!!!!

awè
04-05-2007, 12:52
ok.... ho provato ad utilizzare la codifica con il controllo..... ed esce con successo!!!
ho capito perchè hai voluto dichiarare una variabile di tipo unsigned int, perchè ci serve per il controllo, in quanto altrimenti se l'avremmo fatto su un unsigned char avrebbe controllato solo la prima cifra dell'intero valore dato in input e quindi il compilatore l'avrebbe inserito ugualmente nella matrice.......

però non ho capito perchè, dopo aver inserito il valore (t), vai ad effettuare il cast della variabile, ovvero mat[i][j] = (unsigned char)t;

oregon
04-05-2007, 12:58
Il cast della variabile e' per evitare che il compilatore (non tutti lo fanno ma e' giusto che lo facciano) emettano un warning di eventuale perdita dei dati ...

Loading