studiando non ho ben capito la differenza fra funzioni e prototipi di funzioni, mi potreste spiegare la differenza magari con un esempio?
grazie
studiando non ho ben capito la differenza fra funzioni e prototipi di funzioni, mi potreste spiegare la differenza magari con un esempio?
grazie
Il prototipo e' rappresentato
dal tipo di dato restituito dalla funzione
dal nome della funzione
dal numero e tipo degli argomenti accettati
e questo basta ... ad esempio
float AreaQuadrato(float lato);
Questa scrittura ti dice tutto quello che ti ho scritto ma NON ti dice nulla sul CODICE usato all'interno. Potresti non vedere il codice (in quanto questo e' in una libreria) ma sapere come utilizzare la funzione dal suo prototipo.
La funzione e' ad esempio
float AreaQuadrato(float lato)
{
return(lato * lato);
}
ovvero tutto quello di cui ti ho detto compreso il codice ...
è proprio questo che non capisco.
cosa mi serve un prototipo?
dichiaro una funzione senza codice in pratica?
ma lo trovo inutile, e sicuramente sbaglio
perchè mai dovrei dichiarare una una funzione senza codice?
Te lo spiego. Qui entrano due fattori logici, il compilatore, ed un'altro programmatore che legge il tuo codice.
Nel secondo caso, se un'altra persona leggesse il tuo codice sarebbe più logico che prima si leggesse la funzione main (principale) nella quale verranno richiamate alcune funzioni e che dal main passerà a leggere la funzione che sarà scritta al disotto della funzione main stessa.
ES:
Il tutto permette una lettura logica dell'algoritmo. Ma questo comporta di dover inserire dei prototipi, per il semplice motivo, che BISOGNA comunicare al compilatore, che dopo la funzione main principale, troverà altre funzioni, che probabilmente verranno chiamate dal main o da altre funzioni.codice:->prototipo di funzione; main() { .. .. Chiamo la funzione passandogli alcuni valori... } funzione { leggo la funziona sapendo cosa ha ricevuto e cosa sta facendo con quei valori }
Immaginati invece un programmatore che invece inizia a leggere il tuo codice partendo dalle funzioni, non capirebbe nulla... perchè oltre a vedere cosa fanno, non sa il perchè e con che valori stanno lavorando. Invece questo caso è favorevole per il compilatore che già viene a conoscere la struttura delle funzioni stesse.
Spetta a te stabilire il tuo stile di scrittura... io ti conglio fortemente di magari scrivere una riga in più per i prototipi, ma rendere più logica la struttura del tuo algoritmo.
Spero di essere stato chiaro![]()
La curiosità è la fonte della conoscenza.
quindi il prototipo è utile al programmatore per sapere che ci sarà una funzione definita dentro al main, quindi è comodo perchè posso leggere direttamente il codice della funzione mentre sto leggendo tutto il programma del main. ma il prototipo è scomodo al compilatore perchè non sa subito il codice e i dati che verrano utilizzati.
quindi per il compilatore è più comoda la funzione, per il programmatore il prototipo, ma non c'è ancluna differenza essenziale, ottimo.
un'ultima cosa, se definisco un prototipo, poi dentro al main posso anche non mettere la funzione del prototipo, posso anche non usare il prototipo?
grazie
Il prototito si fa delle funzioni al di fuori del main. anche perchè tutte le funzioni che tu chiami nel main, sono al di fuori, nel main tu metti semplicemente la chiamata della funzione stessa.
Ora 100% non ricordo però mi sembra che se definisci un prototipo di una funzione che poi non utilizzi, non da errore ma ti avverte con un Warning, cmq è da provare..
![]()
La curiosità è la fonte della conoscenza.
Il prototipo serve essenzialmente al compilatore.
Semplificando, quando il compilatore esamina il sorgente per trasformarlo in codice macchina, potrebbe incontrare una chiamata ad una funzione di cui, in quel momento, non sa nulla.
Poco importa se sta compilando il codice del main (che e' anch'essa una funzione ...) o di un'altra funzione ...
Quindi, nel caso in cui ci fosse
il compilatore non saprebbe come trasformare la chiamata a funzione2 perche', in quel momento, non saprebbe come e' fatta la funzione2 (quali e quanti argomenti ha e quale valore restituisce).codice:int funzione1(int a) { ... funzione2(x); } void funzione2(int v) { ... }
In questo caso, e' utile l'uso del prototipo che, essendo posto prima permette al compilatore di avere in tempo utile le informazioni sulla funzione2 e solo in seguito di occuparsi del suo codice ... avresti quindi
Questo fatto potrebbe non essere necessario se il codice della funzione fosse posta prima del suo utilizzo in altre funzioni (non sempre si puo' fare). Quindi, in questo caso, il prototipo non sarebbe necessariocodice:void funzione2(int v); int funzione1(int a) { ... funzione2(x); } void funzione2(int v) { ... }
codice:void funzione2(int v) { ... } int funzione1(int a) { ... funzione2(x); }
ok, adesso credo di aver capito, provo a sbatterci un pò la testa sul compilatore.
grazie