Newsgroup: it.comp.lang.c
Titolo: Che cos'è il casting?

Scusate se vi scrivo, sono un neofita del c, vorrei chiedervi se mi
spiegate per cortesia che cos'è il casting, dove si applica, perchè si
applica e magari anche un esempio pratico per capire meglio.
Scusate ancora l'ignoranza....

 applica e magari anche un esempio pratico per capire meglio.
In maniera molto rude:
Il cast serve per convertire un tipo di dato in un'altro. Prendi ad esempio
il caso in cui tu voglia per qualche ragione assegnare ad una variabile di
tipo float il risultato di una divisione di un intero per un numero che non
sia di esso un divisore. Detto risultato verrebbe privato della parte
decimale in quanto la divisione tra interi non prevede (ovviamente) parti
decimali. Se vuoi conservarlo, devi applicare un cast a float alla variabile
intera. Cioè
int i=36;
float divisione;
divisione = (float)i/5;
Il nome del tipo di dato, tra parentesi e applicato prima della variabile,
dice al compilatore di trasformare il numero intero in rappresentazione
float, così la divisione avrà risultato 7.2 , invece che 7 come sarebbe
capitato senza il cast.
ciao
marco
--
Marco Coppo
University Of Sheffield
FAQ del gruppo: 
http://www.programmazione.it/linguaggi/c/itcomplangc.htm

divisione = (float)i/5;
Be', ma in questo caso basterebbe scrivere :
divisione = i/5.0 ;
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
---------------------------------------------

applica e magari anche un esempio pratico per capire meglio.
Per "casting" si intende la trasformazione di un tipo di dato in un
altro.
Ti faccio un esempio :
La libreria standard del C possiede una funzione di ordinamento
qsort() generalizzata, che per per confrontare due elementi richiama
una funzione di confronto del tipo :
int compare( void *p1, void *p2 ) ;
ovviamente p1 e p2 rappresentano i puntatori ai due elementi da
confrontare e devono essere di tipo puntatore-a-void perche' non si
conosce a priori il tipo degli elementi che verranno ordinati
(potrebbero essere int, long, stringhe, ecc...)
Quindi se io voglio eseguire una funzione di confronto tra due interi
scrivero' :
int compare( void *p1, void *p2 )
{ 
    int *ip1 = (int*)p1 ;  
    /* cast da puntatore-a-void a puntatore-a-int */
    int *ip2 = (int*)p2 ;
    if ( *ip1 == *ip2 ) return 0 
    else
    if ( *ip1 < *ip2 ) return -1
    else
      return 1 ;
}
Se invece volessi confrontare due stringhe :
int compare( void *p1, void *p2 )
{ 
    char *cp1 = (char*)p1 ;  
    /* cast da puntatore-a-void a puntatore-a-int */
    char *cp2 = (char*)p2 ;
 
    return strcmp( cp1, cp2 ) ;
}     
Questo e' uno dei tanti esempi in cui il cast risulta utile.


 divisione = i/5.0 ;
Concordo, solo che era l'esempio più semplice che mi  veniva in mente, che
fosse comprensibile ad uno che è all'inizio.


 applica e magari anche un esempio pratico per capire meglio.
Il casting è la conversione esplicita da un tipo di dato ad un altro. Si
applica in quei rari casi in cui si ha bisogno di effettuare una
conversione che il compilatore non esegue in modo implicito. Dovrebbe
essere utilizzato il meno possibile e spesso è indice di errata
progettazione. Esempio pratico:
#include <stdio.h>
int main()
{
    int a = 1;
    int b = 2;
    double c = a / b;
    double d = ( double ) a / b;
    printf( "%f %f\n", c, d );
    return 0;
}
Nota la differenza tra il risultato che si ottiene in c e quello in d.
EMG

     int *ip1 = (int*)p1 ;
In questo caso non c'è bisogno del cast in quanto la conversione da void
* a int * è implicita (come nella malloc()).
EMG

* a int * è implicita (come nella malloc()).
L'esempio serve a far capire che cos'e' il cast !
