Newsgroup: it.comp.lang.c
Titolo: Da *char a int...

 'The Krazy One'   ::--------
->  "To reign is worth ambition, though in hell."   |  UIN: 21267457  <-
-<  "Better to Reign in Hell Than Serve in Heaven"  | ircnet: krazy98 >-
---** Old age is better than the alternative. **---

Ciao Pietro,
puoi assegnare tramite cast il numero contenuto nel carattere
alla variabile intera, sottraendo il carattere '0'.
int num;
num = (int)(buffer[n] - '0');
ciao, Franco.
--
Posted from [194.184.225.66] by way of 
law2-oe3.hotmail.com
 [216.32.180.107]
via Mailgate.ORG Server - 
http://www.mailgate.org

num = (int)(buffer[n] - '0');
Non credo sia questo che PF voglia fare.
Lui dice "...io leggo un solo byte per volta, pero' questo byte letto
mi serve dentro un int..."
La trasformazione in questo caso e' automatica da char a int.
Invece nel caso volesse trasformare una stringa in numero puo'
utilizzare la funzione atoi() (la tua soluzione e' poco portabile).

 'The Krazy One'   ::--------
->  "To reign is worth ambition, though in hell."   |  UIN: 21267457  <-
-<  "Better to Reign in Hell Than Serve in Heaven"  | ircnet: krazy98 >-
---** NEWS! Drunk gets nine months in violin case **---

 convertire?
Intendi dire che ogni byte letto deve essere messo dentro una variabile
di tipo int oppure che devi ottenere in un int i valori numerici, anche
formati da piů di una cifra, letti dal file? Nel primo caso la
conversione č automatica (si chiama promozione) mentre nel secondo
potresti utilizzare la funzione sprintf() ma comunque ti devi
organizzare un po' la cosa.
EMG

 num = (int)(buffer[n] - '0');
Se non vado errato il cast č inutile.
EMG

 'The Krazy One'   ::--------
->  "To reign is worth ambition, though in hell."   |  UIN: 21267457  <-
-<  "Better to Reign in Hell Than Serve in Heaven"  | ircnet: krazy98 >-
---** HAL 9000: Dave. Put down those Windows disks, Dave. DAVE! **---

Almeno... credo non si possa fare... faremi sapere...
Capisco, no non si puo' fare e il motivo e' chiaro : perche' il tipo
(char*) non e' compatibile con (int).
Pero' attenzione perche' qualche compilatore potrebbe non segnalarlo
come errore, ma dare un semplice avvertimento, convertendo (pur senza
cast) il valore del puntatore in intero.
Invece, se si vuole convertire il numero letto come stringa in numero
intero, bisogna utilizzare la funzione standard atoi() in stdlib.h,
cioe' :
giovanni = atoi ( peppe ) ;

 utilizzare la funzione atoi() (la tua soluzione e' poco portabile).
Oopss! Certo, io avevo erroneamente consigliato la sprintf() che invece
esegue l'operazione inversa.
EMG

 wrote:
[ snip ]
PF>Il problema e' che non credo di poter fare
PF>char *peppe;
Perche' lo dichiari come puntatore ?
E' corretta
	char peppe;
PF>int giovanni;
PF>read(stdin,&peppe,1);
'stdin' e' uno stream, read() richiede un file descriptor, per cui usa
	read(STDIN_FILENO, &peppe, 1);
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 Almeno... credo non si possa fare... faremi sapere...
  Puoi pero` fare:
	giovanni=*peppe;
	Alla prossima,
		Marco



No, credo di essere io ad aver frainteso.
PF scrive :
"read(stdin,&peppe,1);"
                   ^ questo uno penso significhi che legge un
carattere alla volta.
In questo caso la promozione e' automatica e si puo' fare 
giovanni = *peppe

 giovanni = atoi ( peppe ) ;
	Considerato che la famiglia strto...() gestisce meglio gli errori 
della famigllia ato...(),  e
atoi( s ) 
equivale a 
(int) strtol( s, NULL, 10)
converrebbe scrivere
giovanni = (int) strtol( peppe, NULL, 10 );
	Ciao,
		Giulio

giovanni = (int) strtol( peppe, NULL, 10 );
In questo caso non c'e' convenienza rispetto ad atoi() in quanto non
c'e' una gestione dell'errore, vista l'equivalenza delle due
espressioni.
Per gestire correttamente l'errore conviene utilizzare una funzione
come la seguente :
int stoicvt ( const char * s, int * v )
/*
 * Restituisce 1 in caso di successo
 *             0 in caso di errore
 */
{
   char * p ;
   *v = strtol ( s, &p, 10 ) ;
   return ( (p != s) && (*p == '\0') ) ;
}
Comunque si e' capito che l'operazione che PF voleva fare non e'
questa.
Lui vuole leggere da un file un byte alla volta, memorizzarlo in un
char (e' per questo che citava il char *, in quanto passa un char per
riferimento) e tradurre quel valore in un intero.
Una volta che il valore e' stato copiato in un char c (mediante
appunto &c, passato a read()) viene convertito nell'intero i mediante
la semplice assegnazione i = c, la quale promuove il valore intero
piccolo char nel valore intero di dimensioni piu' grandi.