Newsgroup: it.comp.lang.c
Titolo: Leggere una struttura di char

Salve, ho problemi nella lettura della seguente struttura:
struct rgb {
            char r;
            char g;
            char b;
};
se uso la funzione scanf con il parametro %d, scanf("%d",&colour.r);
ottengo un warning : "warning: format '%d' expects type 'int*' but 
argument 2 has type 'char *'
se invece uso la scanf con il parametro %c viene saltato un membro della 
struttura, il secondo
Se uso getchar, ad esempio:
colour.r=getchar();colour.g=getchar();colour.b=getchar()
viene sempre saltato il secondo membro della struttura
Come posso risolvere questo problema ?
Francesco


Prima di tutto, se vuoi essere aiutato, devi postare un programma
intero funzionante che dimostra il problema.
Piccoli pezzi di codice sparso non permettono di essere aiutati:
ricordati che la gente che gira su questo forum, se esperta, non ha
tempo da perdere, semplicemente vuole aiutare altri programmatori.
Secondo, nel tuo caso, stai ricevendo l'input da stdin. Il che non e'
sotto controllo programmatico, quindi devi almeno darci un esempio di
una sessione di input, per esempio un copia e incolla della tua
sessione al terminale.

 argument 2 has type 'char *'
Non &colour.r (che equivale a colour->r) bensì &(colour.r) ovvero
l'indirizzo del campo r.
hth,
Lokar 

 Lokar
Per leggere un char dovresti usare %c, o la getchar come gia` fai. Ma
come hanno gia` detto n un post precedente, dovresti fornirci un esempio
d'utilizzo per capire cosa non va. Secondo me la seconda getchar si
becca un tuo \n.
Rimaniamo in attesa :)
Antonio



Allora, ho cambiato leggermente il programma, che sembra funzionare
#include "stdio.h"
#include "stdlib.h"
struct rgb {
            unsigned char r;
            unsigned char g;
            unsigned char b;
};
unsigned long int rgb2int(struct rgb  colore);
int main()
{
struct rgb colour={255,255,255};
char r[3],g[3],b[3];
unsigned long int colore;
printf("Red:");
colour.r=atoi(fgets(r,5,stdin));
printf("Green:");
colour.g=atoi(fgets(g,5,stdin));
printf("Blue:");
colour.b=atoi(fgets(b,5,stdin));
printf("%d %d %d\n",colour.r,colour.g,colour.b);
colore=rgb2int(colour);
printf("Colore=%lu\n",colore);
return 0;
}
unsigned long int rgb2int(struct rgb  colore)
{
unsigned long int x;
x=colore.r+colore.g*256+colore.b*256*256;
return x;
}
Quello che volevo fare io era leggere 3 interi il cui valore era 
compreso  tra 0 a 255 e memorizzarli in una struttura di tre campi di 
tipo char. 
Avevo provato con:
int main()
{
struct rgb colour={255,255,255};
unsigned long int colore;
printf("Red:");
colour.r=getchar();
printf("Green:");
colour.g=getchar();
printf("Blue:");
colour.b=getchar();
printf("%d %d %d\n",colour.r,colour.g,colour.b);
colore=rgb2int(colour);
printf("Colore=%lu\n",colore);
return 0;
}
ma mi saltava la lettura del secondo carattere, il verde, quando cercavo 
di inserire valori numerici con 3 cifre. A parte, mi sono reso conto che 
in tal modo non avrei inserito un valore decimale da 0 a 255. Ma il 
codice Ascii del carattere inserito.
Ho provato poi la lettura con la scanf, ma l'errore era lo stesso

 colour.r=getchar();
Stai confondendo char e int.
getchar() ritorna il valore intero del carattere che legge. Quindi se
immetti
"230" stai immettendo una stringa formata da 3 caratteri, di cui
getchar() ritorna soltanto il valore intero del primo. Il primo
carattere è '2', il cui valore (vedi ascii) è 50. Le due prossime
chiamate a getchar() ritorneranno 51 ('3' in ascii) e 48 ('0').
Questo non puo essere quello che vuoi tu, perché non riusciresti ad
esprimere con la tastiera tutti i 256 valori possibili.
atoi() + fgets() è una buona idea.. anche se come l'hai usata tu
presenta dei rischi in quanto fgets() puo ritornare null. Se vuoi
usare scanf() con %d allora devi usare gli int nella struct; se usi %c
hai lo stesso problema di getchar().
Qualcosa del genere è piu corretto:
char r[4]; // * 3 possibili + 1 di terminazione
if( fgets(r,4,stdin))
  color.r = atoi(r);
Saluti
M`