Newsgroup: it.comp.lang.c
Titolo: Prototipi: sono obbligatori?

Ho notato che spesso, quando dimentico di inserire i prototipi di una
funzione, il compilatore non restituisce errore (sempre Dev C++4.01).
E' una peculiarità del compilatore, oppure i prototipi non sono in
generale necessari?
Ho dato un'occhiata veloce al K&R, ma non mi sembra d'aver addocchiato
nulla in proposito.
-- 
Cordiali saluti
  Artemio


Quando non specifichi il prototipo della funzione che usi, il compilatore
assume come prototipo quello corrispondente all'uso che ne fai per il
passaggio dei parametri, e con valore di ritorno sempre int.
quindi i prototipi sono sempre necessari per garantire la correttezza della
chiamata.
supponi di realizzare un programma in 2 sorgenti:
1- main.c ------------------------
int main ( void )
{
  float   r = 1;
  float val = funzione( r );
}
2- funzione.c --------------------
float funzione ( int x )
{
  return x * x * 3.14;
}
nel comiplare entrambi non hai errori (anche se BC5 ti da un warning per
mancanza del prototipo di "funzione") ma ottieni dei grossi errori nella
chiamata alla funzione:
il compilatore passera' a "funzione" un valore float perche' senza il
prototipo non sapeva di doverlo convertire in int,
funzione al suo interno lo tratta come intero quindi fara' i calcoli con un
numero completamente sbagliato, e ritornera' un float.
ma il compilatore tratta il valore di ritorno come fosse un int (stesso
errore di prima), quindi legge un valore sballato, lo converte in float e lo
memorizza in "val".
ciao
donCiccio

nulla in proposito.
[la risposta te l'hanno gia data, aggiungo una mia nota]
L'occhiata doveva essere veramente molto veloce :)
Scherzi a parte, io ti consiglio un libro: "C tricks and pitfalls" di
Andrew Koenig... ti chiarisce molto bene questo e altri aspetti un po'
oscuri del C.
Dal C99 in poi i prototipi invece sono obbligatori, visto che non ci
sara' piu' l'assunzione per cui le funzioni ritornano int e a quel
punto non ti dara' piu' un warning (o se a te dava gia' errore e'
perche' hai detto al compilatore di trattare tutti i warning come
errori), ma un errore.
-- 
Mox

 chiamata.
Ma i prototipi vanno messi anche quando si scrive la funzione
prima del main, come in Pascal?
--
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
e-mail: 
cerch...@ciaoweb.it
 
33813471...@tim.it
ICQ #147054457
Ni hau, Cerchietto
"La radice della pazienza è amara, il frutto è dolce"
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_


No perche' la definizione della funzione e' gia' di per se il prototipo
della funzione.
Il prototpo serve al compilatore per sapere come richiamare la funzione che
stai usando, se questa funzione l'hai scritta prima del punto in cui la usi,
il compilatore sa gia' come e' fatta (perche' l'ha gia' compilata, la
compilazione avviene in ordine di linea del file sorgente) e quindi non ha
bisogno di altre informazioni.
ciao
donCiccio

prima del main, come in Pascal?
I propotipi vanno messi quando usi una funzione prima che sia
definita.
Quindi NON servono (ma se li metti non ti mangia nessuno) se definisci
tutte le funzioni prima di usarle. Questo ovviamente vale rispetto a
tutte le funzioni, non solo rispetto al main.
Il problema e' che su progetti complessi difficilmente riesci a tenere
questa struttura, percio' si usano gli header file per contenere tutte
le dichiarazioni.
-- 
Mox

definita.
E' dunque per questo che molti sorgenti contengono *prima* le funzioni
e *dopo* il main, giusto? Sana abitudine: la ricorderò.
Ho fatto una prova secondo varie combinazioni, e grazie a quanto dici
finalmente mi spiego *tutti* questi warning (ricavati da un programma
scritto proprio per causarli):
warning: return makes pointer from integer without a cast
warning: type mismatch with previous implicit declaration
warning: previous implicit declaration of `strmid2'
warning: `strmid2' was previously implicitly declared to return `int'
Ogni tanto mi è apparso uno di questi, il più delle volte senza creare
problemi in esecuzione. Ora finalmente ho capito il motivo.
Grazie mille!
-- 
Cordiali saluti
  Artemio