Newsgroup: it.comp.lang.c
Titolo: Funzione che chiama funzione in C

Per esercitarmi (C) ho scritto il codice riportato sotto che mi genera 
l'errore riportato alla fine.
Dove sbaglio?
 
Ciao
 
nero23
 
 
 
 
// INIZIO CODICE
#include <stdio.h>
void funz(const int n);
 
void pippo(const int x);
 
int main(void)
     {
     pippo(23);
     return 0;
     }
 
 
void pippo(const int x)
{
funz(x)
return 0;
}
 
 
void funz(const int n)
{
printf("%d",n);
return 0;
}
// FINE CODICE
 
 
 
 
******************************
ERRORE:
D:\00 CODEBLOCKS\test\main.c||In function 'pippo':|
D:\00 CODEBLOCKS\test\main.c|16|error: expected ';' before 'return'|
D:\00 CODEBLOCKS\test\main.c||In function 'funz':|
D:\00 CODEBLOCKS\test\main.c|25|warning: 'return' with a value, in 
function returning void [enabled by default]|
||=== Build finished: 1 errors, 1 warnings (0 minutes, 1 seconds) ===|

 return 0;


> return 0;
 
Curiosita':
Ma che senso ha dichiarare const un parametro di una funzione?
 
Ciao
Giuseppe
 

 Ma che senso ha dichiarare const un parametro di una funzione?
 
il codice riportato qui mi ï¿œ solo di esempio per spiegare il problema 
che ho riscontrato con un codice molto piï¿œ complesso...
 
ciao
 
nero23

 Hai letto quello che ha stampato il compilatore ?
 
sinceramente non sono riuscito a capire il problema :(
 
 

 sinceramente non sono riuscito a capire il problema :(
 
Una funzione void non può ritornare un intero! ;)
 
Ciao!

Ho risolto.
Mancava un semplice ';'
 
funz(x) --> funz(x);
 
 
Ciao


 sinceramente non sono riuscito a capire il problema :(
 
Però non hai risposto alla mia domanda.
 
Potresti non aver letto affatto i messaggi e questo spiegherebbe perché 
non hai capito il problema.
 
In questo caso è più utile imparare a leggere i messaggi del compilatore 
che mettere un punto e virgola.
 
Togliamo  "D:\00 CODEBLOCKS\test\main.c|" e il messaggio diventa
 
In function 'pippo':
16|error: expected ';' before 'return'
 
Cioè: nella funzione 'pippo', alla riga 16 del file main.c, mi aspettavo 
';' prima di 'return' 
 
Vedi che l'aveva detto chiaramente cosa non andava, e questo era 
l'errore.
 
Per quanto riguarda l'avvertimento:
 
In function 'funz':
25|warning: 'return' with a value, in function returning void
 
Cioè: attenzione, nella funzione 'funz' alla riga 25 del file main.c, 
usi return con un valore ma la funzione ha dichiarato di non ritornare 
alcun valore.

 Ho risolto.
 
Sì ma il punto (e virgola) non era quello.

 alcun valore.
 
Ora ho aggiunto solo il ; e il compilatore non mi segnala nessun errore.
 
Ciao
 

 Ora ho aggiunto solo il ; e il compilatore non mi segnala nessun errore.
 
E io che perdo pure tempo a scrivere…

Il 20/01/13 16:23, Andrea D'Amore ha scritto:

ROTFL :)

 Ma che senso ha dichiarare const un parametro di una funzione?
 
Nel caso di un int, come nell'esempio dell'OP, in effetti non capisco a 
cosa possa servire. Anzi, potrebbe essere pure scomodo in alcuni casi. 
Per esempio, non potrei fare questo, che è decisamente accettabile:
 
void print_array(const int *x, const int size) {
   while(size--) {
     printf("%d\n", *x++);
   }
}
 
 
Se il parametro della funzione è un puntatore, invece, penso sia 
fondamentale definire l'area puntata come const, sempre se la funzione 
non deve modificare il contenuto.
 
Prima di tutto, perchè altrimenti il compilatore potrebbe dare errori in 
casi semplici come il seguente (non so se è obbligato a dare errore 
oppure si potrebbe limitare a dare warning... e comunque penso che lo 
standard non garantisca il corretto funzionamento):
 
   const char stringa[] = "Hello!";
   void print_string(char *str) {
     printf("%s", str);
   }
   ...
   print_string(stringa);
 
Non dovrei essere costretto a dichiarare "non const" stringa solo per 
far piacere ad una funzione che, pur non modificando l'area puntata, non 
è correttamente dichiarata.  Considera che spesso i compilatori per 
piattaforme embedded allocano le costanti in una zona di memoria 
read-only e non in RAM e questo può essere importante nel caso in cui si 
abbiano parecchie variabili statiche con una memoria RAM limitata.
 
Ma non è soltanto questo il problema.  Considera che se la funzione non 
deve modificare l'area puntata e erroneamente lo fa, il compilatore non 
può avvisarti.  Se il parametro è una variabile "non puntatore", allora 
l'effetto è innocuo (tanto la variabile è passata per valore), ma se il 
parametro è un puntatore fai danni.
 
Forse ci sono altre ragioni...
 

 Forse ci sono altre ragioni...
 
No, non ci sono: il const lì è completamente inutile, visto che in ogni caso
il parametro viene copiato.
L'OP non ha di certo dato prova di capire a pieno il linguaggio.
 
Ciao!