Funzioni in C

di il
7 risposte

Funzioni in C

Ragazzi scusate, siccome sto impazzendo a capire cos'è una funzione in C qualcuno potrebbe fare un piccolissimo esempio (per esempio: ogni volta che richiamo la funzione e metto addfun(5) me lo deve sommare con un numero fisso il 2 per esempio) oppure una funzione ancora più chiara in modo che capisco come funziona) per il motivo che è spiegato male in "thinking in c".

Grazie mille in anticipo

7 Risposte

  • Re: Funzioni in C

    La funzione in c -come una qualsiasi altra funzione informatica- permette di spezzare il programma in modo da semplificarne l algoritmo e non ripetere porzioni di codice. può prevedere il passaggio di argomenti per valore o riferimento.esempio:
    
    #include <stdio.h>
    int foo (int valore)
    {
       valore=valore+1;
       return valore; 
    }
    
    void foo2 (int *refvalore)
    {
       *refvalore=(*refvalore)+1;
    }
    
    int main ()
    {
       int val=5;
    
       val=foo(val); // qui val ritorna 6
       foo2(&val);   // qui diventa 7
    
       printf ("%d\n",val);
    
       return 0;
    }
    
  • Re: Funzioni in C

    Scusate la mia ignoranza ma mi sembra ancora troppo complicato, date per scontato che non abbia la minima idea di cosa è una funzione.
    Domande:
    1. cosa è il return valore ? Conoscevo finora solo il "return 0;"
    2. cosa significa il void ?
    3. come mai tutto questo viene riscritto per una seconda volta ??
    void foo2 (int *refvalore)
    {
       *refvalore=(*refvalore)+1;
    }
    4. cosa significa questo simbolo * prima della variabile refvalore ?
    5. ehmm..cos'è questo passaggio ?
    int val=5;
    
       val=foo(val); // qui val ritorna 6
       foo2(&val);   // qui diventa 7
    
    non capisco il simbolo "&" davanti a val.

    Purtroppo sto studiando da solo a casa coi libri e se non chiedo a voi non so a chi rivolgermi non avendo ne conoscenze e ne amici.
    Cmq grazie di vero cuore dell'aiuto
  • Re: Funzioni in C

    Return è una keyword che serve a restituire un 'qualcosa' alla funzione chiamante. Quando leggi return 0 semplicemente restituisce 0. La funzione main necessaria all'esecuzione del tuo programma deve restituire un valore perchè nel suo prototype è definito. Se ometto la parola chiave return il complilatore mi 'segnala' che non ritorna il valore; per cui, se ho una funzione che chiamo 'foo' e la definisco:
    
    int foo ()
    {
       int valore_da_restituire;
       /*    
          corpo della funzione   
          bla bla & blabla
          valore_da_restituire = (bla+blabla-pingpong);
       */
       return (valore_da_restituire);
    }
    
    mi aspetto che essa restituisca un valore intero. Se anzichè int ho float devo riceve un float ecc...ma se io definisco il tipo void non mi aspetto niente indietro.

    Nella definizione della funzione, posso anche stabile se essa dovrà ricevere qualcosa dal chiamante; in questo caso lo devo definire, cioè devo indicare i parametri come riceve e il tipo di dato associato. Esempio:
    
    int foo (int valore)
    {
       int valore_da_restituire;
       /*    
          corpo della funzione   
          bla bla & blabla         vvvv 
          valore_da_restituire =  valore + (bla+blabla-pingpong);
       */
       return (valore_da_restituire);
    
    }
    
    Un esempio completo chiamate-funzione è:
    
    int foo (int val)
    {
    
      val=val+1;
      
      return val; 
    }
    
    int main ()
    {
      int y,z;
      
      y=3;
      
      z=foo (y);
    
      return 0;
    }
    

    Vediamo nel dettaglio cosa succede...
    la funzione main definisce 2 variabili (y e z) e inizializza y=3. Queste variabili sono locali, vengono viste solo dalla funzione main. Quando chiamo la funzione foo gli passo il valore della mia y (3) ed attendo che mi restituisca un'altro valore che andrò a memorizzare nella variabile z... a questo punto foo legge il valore che la funzione main gli sta passando e lo registra in una sua variabile locale che chiamiamo val. (nota che val e y non hanno niente in comune se non lo stesso valore - entrambe valgono 3 -), incremento val di uno ed uso 'return' per restituire il valore della variabile -ora è 4-... ecco che main assegna alla sua variabile z il valore restituito da foo.

    Se questo è chiaro fai delle prove.. quando sei veramente illuminato proseguo a spiegarti il resto

    uoos n ??s,
    Max
  • Re: Funzioni in C

    La spiegazione del mio collega è stata molto chiara. cercherò di essere ancora più elementare se non hai ancora capito qualcosa. facciamo l'esempio di una funzione che calcola la somma di due numeri.
    
    float colcolasomma(float numero1, float numero2)
    {
      float somma;
      somma = numero1 + numero2;
      return somma;
    }
    
    float è il valore che ritornerò, calcolasomma è il nome che diamo alla funzione e numero1 e 2 sono i numeri che devo passare come argomenti. poi dichiaro la variabile "somma" e gli assegno il valore di numero1 più numero2 e scrivo return somma;
    a questo punto richiamo la funzione in main:
    
    int main(void)
    {
      float a=10, b=25, c;
      c = calcolasomma(a,b);
      printf("%f", c);
      return 0;
    }
    
    dichiaro le due variabili a e b e gli assegno un valore. dichiaro che c è uguale a calcolasomma(a,b) questo vuol dire che main chiama calcolasomma e gli scrive le variabili a, b. calcolasomma capisce che deve assegnare i valori di a e b ai suoi argomenti (numero1, numero2). calcolamedia poi assegna a somma (che è una variabile interna alla funzione) il valore di a+b che nel frattempo ha copiato in numero1 e numero2. poi dice a main che "somma" è il valore ottenuto e main lo assegna a c. poi main stampa con printf il valore ottenuto (che è 35).

    un altro esempio di funzione è questa, che scambia due numeri interi.
    
    void scambio(int *n1, int *n2)
    {
      int *temp;
      *temp = *n1;
      *n1 = *n2;
      *n2 = *temp;
    }
    [code]
    lìasterisco vuol dire che quello non è un int ma un puntatore a int. questo vuol dire che *n1 o *n2  contengono  il VALORE di n1 e n2 mentre &n1 e &n2 l'indirizzo nella memoria RAM.
    siccome una funzione assegna ai suoi argomenti una copia della variabile, senza puntatori sarebbe imposssibile fare lo scambio. con i puntatori basta  chiamare da main
    [code]
    scambio(&a, &b);
    
    e le variabili a e b si ritroveranno nell'indirizzo in memoria dell'altro. main a quel punto chiamando la variabile che si trova all'indirizzo di a trova il valore di b e viceversa.
  • Re: Funzioni in C

    La spiegazione del mio collega è stata molto chiara. cercherò di essere ancora più elementare se non hai ancora capito qualcosa. facciamo l'esempio di una funzione che calcola la somma di due numeri.
    
    float colcolasomma(float numero1, float numero2)
    {
      float somma;
      somma = numero1 + numero2;
      return somma;
    }
    
    float è il valore che ritornerò, calcolasomma è il nome che diamo alla funzione e numero1 e 2 sono i numeri che devo passare come argomenti. poi dichiaro la variabile "somma" e gli assegno il valore di numero1 più numero2 e scrivo return somma;
    a questo punto richiamo la funzione in main:
    
    int main(void)
    {
      float a=10, b=25, c;
      c = calcolasomma(a,b);
      printf("%f", c);
      return 0;
    }
    
    dichiaro le due variabili a e b e gli assegno un valore. dichiaro che c è uguale a calcolasomma(a,b) questo vuol dire che main chiama calcolasomma e gli scrive le variabili a, b. calcolasomma capisce che deve assegnare i valori di a e b ai suoi argomenti (numero1, numero2). calcolamedia poi assegna a somma (che è una variabile interna alla funzione) il valore di a+b che nel frattempo ha copiato in numero1 e numero2. poi dice a main che "somma" è il valore ottenuto e main lo assegna a c. poi main stampa con printf il valore ottenuto (che è 35).

    un altro esempio di funzione è questa, che scambia due numeri interi.
    
    void scambio(int *n1, int *n2)
    {
      int *temp;
      *temp = *n1;
      *n1 = *n2;
      *n2 = *temp;
    }
    [code]
    lìasterisco vuol dire che quello non è un int ma un puntatore a int. questo vuol dire che *n1 o *n2  contengono  il VALORE di n1 e n2 mentre &n1 e &n2 l'indirizzo nella memoria RAM.
    siccome una funzione assegna ai suoi argomenti una copia della variabile, senza puntatori sarebbe imposssibile fare lo scambio. con i puntatori basta  chiamare da main
    [code]
    scambio(&a, &b);
    
    e le variabili a e b si ritroveranno nell'indirizzo in memoria dell'altro. main a quel punto chiamando la variabile che si trova all'indirizzo di a trova il valore di b e viceversa.
  • Re: Funzioni in C

    Se questo è chiaro fai delle prove.. quando sei veramente illuminato proseguo a spiegarti il resto
    Ciao sono illuminato al massimo, ho capito come creare una funzione elementare e ne ho create già 2 diverse.
    Non so come ringraziarvi
    Cmq i puntatori ancora non li ho studiati sono arrivato alla funzione Random dei numeri casuali.
    Se c'è qualcos'altro da sapere e hai del tempo continua pure, aspetto con ansia il resto della spiegazione e grazie a tutti ancora.
  • Re: Funzioni in C

    Allora c'è da sapere che quando chiami una funzione il programma COPIA la variabile e non prende in considerazione direttamente quella. es.
    
    void incrementa(int numero)
    {
      numero++;
    }
    int main(void)
    {
      int n=0;
      incrementa(n);
    }
    
    non funziona perchè accade questo:
    - il programma copia n in numero.
    - incrementa numero;
    - chiude la funzione.

    quindi in realtà n non viene incrementato ci sono due soluzioni. o fai:
    int incrementa(int numero)
    {
      numero++;
      return numero;
    }
    int main(void)
    {
      int n=0;
      n = incrementa(n);
    }
    che produce questo effetto:
    - il programma copia n in numero.
    - incrementa numero.
    - ritorna numero ovvero copia numero in n

    oppure usando i puntatori:
    void incrementa(int *numero)
    {
      *numero++;
    }
    int main(void)
    {
      int n=0;
      incrementa(&n);
    }
    che produce questo effetto:
    - il programma copia n nel CONTENUTO del puntatore.
    - incrementa il contenuto.

    il puntatore contiene in * il contenuto della variabile e in & l'indirizzo quindi se usi *n non stai copiando la variabile la stai usando proprio il contenuto di essa.
Devi accedere o registrarti per scrivere nel forum
7 risposte