Newsgroup: it.comp.lang.c
Titolo: funzioni - dichiarazione

Ciao a tutti,
durante il mio studio del C, sono giunto alle funzioni. Ecco il mio
problema:
se una chiamata di funzione come f(x) viene incontrata prima della sua
dichiarazione o definizione, il compilatore assume che la dichiarazione
sia del tipo int f().
La definizione della funzione è però
double f(double x)
{
	return 2 * x;
}
*) Passando alla funzione f un int, ad esempio 2, il 2 viene convertito in
double?
*) Siccome nella dichiarazione della funzione il compilatore si aspetta di
restituire un int  mentre nella definizione deve restituire un double,
durante la compilazione viene restituito un messaggio d'errore, generando
comunque un file eseguibile; cosa succede di preciso? il risultato è di
tipo int o double?
Grazie a tutti.
Angelo

tipo int o double?
Di tipo double.
--
Walkie...@Libero.It (ICQ# 8143647)

 Di tipo double.
idem come sopra.
ciao
donCiccio

ti stai sbagliando, leggi bene il suo messaggio.
Se ho il seguente codice :
int main()
{
    f( 2 ) ;
}
double f( double x ) 
{
       return 2 * x ;
}
La funzione accetta correttamente un double e restituisce un double,
anche se nell'invocazione, il compilatore assume che il ritorno sia
int.
--
Walkie...@Libero.It (ICQ# 8143647)

 int.
no.
gli viene passato un int, che la funzione interpreta come double (quindi
sbagliera' il valore), e poi lei restituisce un double che il chiamante
intepreta come un int, sbagliando anche lui il valore.
prova quello che hai scritto e poi mi dici.
ciao
donCiccio

intepreta come un int, sbagliando anche lui il valore.
Scusa, ma che intendi con "sbagliando il valore" ?
--
Walkie...@Libero.It (ICQ# 8143647)

 ha scritto nel messaggio
news:3b0c84e...@news.libero.it...

sulla mia macchina (DOS) ho questa situazione:
sizeof( int )=2
sizeof( double )=8
nel tuo esempio il main richiamala funzione f passandogli un int cioe'
solo 2 byte (perche' non avendo il prototipo non sa che doveva prima
convertirlo),
ma al suo interno la funzione f() ne legge 8 perche' lei vuole leggere
un double, quindi hai ovviamente un valore sbagliato all'interno di
f().
poi la funzione f ritorna 8 byte cioe' un double (in realta' non e'
cosi', se vuoi ti spiego anche questo, ma per semplicita' supponi che
sia cosi'), ma il main ne legge solo 2 perche' per lui, f() doveva
ritornare un int, e sara' un'altro valore sbagliato.
ciao
donCiccio

Non e' come dici.
Il compilatore, prima o poi, trova la definizione della funzione e
compila correttamente il programma.
Il compilatore assume che la funzione restituisca un int, perche' non
ne trova il prototipo, ma nel momento in cui trova la definizione, usa
quest'ultima per risolvere i suoi dubbi.
Prova a compilare il codice, vedrai che non avrai problemi.
--
Walkie...@Libero.It (ICQ# 8143647)

 
Grazie a donCiccio e Walkie Talkie per l'aiuto.
Vorrei capire meglio quanto accennato da donCiccio:
*) Con l'istruzione f(2); il compilatore passa a f() un int (2 byte).
Siccome f() si aspetta un double, leggerà un valore sbagliato (8 byte -> 2
byte + 6 byte di schifezze).
L'int 2 viene memorizzato utilizzando 2 byte; quando f() legge 8 byte,
prende i 6 byte vicini ai byte che rappresentano l'int?
*) La funzione f() ritorna un double (-> 8 byte di memoria) che viene
trasformato in un int perchè main() si aspetta un int. Come avviene questa
trasformazione?
Thanks.
Angelo

 ha scritto:

Ho provato a compilare questo:
#include <stdio.h>
int main(void)
{
printf("%f\n", f(2));
}
double f(double x)
{
return 2 * x;
}
e ottengo 2.520227.
Se metto in main  
printf("%d\n", f(2));
ottengo -1073743788.
Sono impaziente di capire...
Ciao
Angelo

 Prova a compilare il codice, vedrai che non avrai problemi.
gia' risposto.
tu l'hai compilato?
ciao
donCiccio

 Sono impaziente di capire...
quello che c'e' da capire e' che se il compilatore non ha il prototipo
della funzione gia' definito quando la usa, fa quella stupida
assunzione che la funzione sia 'int f()', che non fa altro che danni,
perche' i tipi di dato passati e ritornati non combaciano.
i valori che vedi nei due esempi che hai postato dipendono piu' che
altro dal caso.
e' un po come se io parlassi francese, tu tedesco, e tra di noi c'e'
stato messo per default un traduttore italiano-inglese perche' mancava
il prototipo del nostro dialogo: non ci capiremo mai.
ciao
donCiccio

 trasformazione?
premetto che su come vengono ritornati i floating point c'e' da
analizzare l'implementazione del compilatore.
supponi (perche' in realta' non e' cosi') che ti ritrovi in uscita
dalla funzione con una area di memoria di 8 byte contenente il valore
di ritorno scritto in double, ma per il main quella funzione doveva
ritornare un int, per cui main ne legge solo i primi 2 byte, che non
vuol dire convertire a double a int, ma bensi' sbagliare completamente
il risultato.
ciao
donCiccio

Prova a compilare il codice, vedrai che non avrai problemi.
Prova a compilare il codice e vedrai che avrai problemi.
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

il codice macchina necessario per eseguire la chiamata.
Hai ragione, e' vero.
--
Walkie...@Libero.It (ICQ# 8143647)