Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    25

    [C] caricamento matrice statica tipo unsigned char

    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.....

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    25
    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!!!!!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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

    codice:
    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

    codice:
    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 ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    25
    ok..... grazie mille.... 6 stato molto esauriente!!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    25
    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;

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.