Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337

    [C] funzione e prototipi

    studiando non ho ben capito la differenza fra funzioni e prototipi di funzioni, mi potreste spiegare la differenza magari con un esempio?

    grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337
    è 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?

  4. #4
    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:
    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
    }
    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.

    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337
    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

  6. #6
    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.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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

    codice:
    int funzione1(int a)
    {
      ...
      funzione2(x);
    }
    
    void funzione2(int v)
    {
       ...
    }
    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).

    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

    codice:
    void funzione2(int v);
    
    int funzione1(int a)
    {
      ...
      funzione2(x);
    }
    
    void funzione2(int v)
    {
       ...
    }
    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 necessario

    codice:
    void funzione2(int v)
    {
       ...
    }
    
    int funzione1(int a)
    {
      ...
      funzione2(x);
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    337
    ok, adesso credo di aver capito, provo a sbatterci un pò la testa sul compilatore.

    grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.