Newsgroup: it.comp.lang.c
Titolo: Tipi di dati: domande...

Sono un neofita del c e fra i vari tipi di dato mi sono imbattuto in un
sorgente in cui vi erano queste notazioni:
(int)num1;
(int)struttura->elemento1;
Cosa significano queste diciture? Come si dichiarano? A cosa serve
dichiarare le variabili cosě? Potete farmi qualche esempio utile di codice
di utilizzo?
Scusate l'ignoranza... e grazie!

 di utilizzo?
   Sono /cast/ di variabili. Cosi` come sono, non servono a nulla. Se si 
fossero presentate in un'assegnazione, sarebbero state indice di un 
cattivo stile di programmazione: in C il /casting/ e` automatico.
-- 
Veri pirati noi siamo       Ma cosa c'e` di male?
Contro il sistema lottiamo  Ma cosa c'e` di strano?
Ci esecritiamo a scuola     Facciamo un gran casino
A far la faccia dura        Ma in fondo lavoriamo
Per fare piu` paura         Per capitan Uncino

 di utilizzo?
Una scrittura del genere:
a=(int)num;
dove a è un int e num un altro tipo di dato, indica un cast esplicito, cioè
la conversione di num in intero; in pratica, se ad esempio num è un float,
ad a viene assegnato la parte intera di num.
La notazione '->' si usa con i puntatori a struttura, e serve a riferirsi ad
un elemento della struttura a cui punta il puntatore, ed in pratica equivale
alla notazione '.' per i tipi struttura: ad esempio:
int a;
struct struttura {
    float elemento1;
    float elemento2;
};
struct struttura st;
st.elemento1=1.1;
st.elemento2=2.2;
struct struttura * ptr=&st;
a=(int)ptr->elemento1;
a questo punto a conterrà il valore 1.
Ciao,
Cecco

   Sono /cast/ di variabili. Cosi` come sono, non servono a nulla. Se si
fossero presentate in un'assegnazione, sarebbero state indice di un
cattivo stile di programmazione: in C il /casting/ e` automatico.
Mi hai fatto sorgere un dubbio:
sicuro che il casting e' automatico in tutti i casi nel linguaggio C.
Oppure intendi nel C implementato nei nuovi compilatori?
grazie

 sicuro che il casting e' automatico in tutti i casi nel linguaggio C.
   Automatico si`, possibile no. Il seguente brano di codice
<code name="cast.c" linenumber="yes">
  1.	struct A {
  2.		int an_int;
  3.		double a_double;
  4.	};
  5.
  6.	int
  7.	main(void)
  8.	{
  9.		struct A a_struct;
10. 
	int another_int;
11. 
	double another_double=3.1415;
12. 
13. 
	another_int=another_double;
14. 
	another_int=a_struct;
15.
16. 
	return 0;
17. 
}
</code>
produce il comprensibile errore:
	cast.c: In function `main':
	cast.c:14: incompatible types in assignment


cattivo stile di programmazione: in C il /casting/ e` automatico.
Beh, dai non sempre e' dannoso il cast :)  In alcuni casi puo'
servire.
Per esempio se devi passare un puntatore qualsiasi a un void *
(perche' hai un'ADT che implementa una lista magari) e poi stampare il
contenuto del void *, senza il cast non ce la fai.
Il contesto in cui mi e' servito di piu' il cast e' stato appunto
usando le ADT.
I cast sono molto utili se cerchi di programmare a oggetti in C. Se
vuoi avere un'idea guarda i sorgenti delle GTK.
Es.
Hai un oggetto cosi':
typedef struct {
   Persona * sup;
   int matricola;
   char * tipo_di_studio;
   [...]
} * Studente;
e hai una funzione che accetta in input "Persona" puoi fare
int function( (Persona)Studente );
Detto cosi' ti puo' parere arabo, per una trattazione piu' dettagliata
rimando ai sorgenti e alla documentazione delle GTK oppure ai vari
documenti in rete sulla programmazione a oggetti in C.
Mox.