Newsgroup: it.comp.os.linux.development
Titolo: g++ e problema stupido

Ciao a tutti
ho avuto un piccolo problema con un ragazzo che faceva esercizi in
lab. Il risultato di una funzione era completamente sballato, come se
la variabile del risultato non fosse inizializzata.
Ho perso un buon 3/4 d'ora, sino a quando ho visto che mancava il
return di una funzione double...
Ma dico, io non avevo nemmeno preso in considerazione il problema,
quello non è un errore di sintassi? Il compilatore non dovrebbe
lamentare la mancanza di return da una funzione double?
Grazie in anticipo per la risposta!
--
Ciao Neo

 lamentare la mancanza di return da una funzione double?
In effetti ritorna solo un warning, e solo se -Wall...
$ cat foo.c 
#include <stdio.h>
double func() {
	printf("Hello!");
}
int main() {
	func();
	return 0;
}
$ gcc foo.c 
$ gcc -Wall foo.c 
foo.c: In function ‘func’:
foo.c:5: warning: control reaches end of non-void function
$ gcc -Wall -Werror foo.c 
cc1: warnings being treated as errors
foo.c: In function ‘func’:
foo.c:5: error: control reaches end of non-void function
$
Ok, non è C++, ma il concetto è uguale: meglio compilare sempre con -Wall
(e talvolta con -Werror, ma senza esagerare, dato che alcuni warning sono
innocui) :)
David
-- 
 . ''`.  Debian maintainer | 
http://wiki.debian.org/DavidPaleino
 : :'  : Linuxer #334216 --|-- 
http://www.hanskalabs.net/
 `. `'`  GPG: 1392B174 ----|---- 
http://snipr.com/qa_page
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

 return da una funzione double?
Benché scorretto non è un errore sintattico o grammaticale 
quindi al massimo ottieni un /warning/ e solo, come sai, se
hai abilitato i controlli su quei /warning/
E qui va una piccola spiegazione. Il C non distingue tra 
procedure e funzioni poiché questa distinzione è ritenuta
superflua; in fondo una procedura è una funzione che non
restituisce alcun valore. Cioè una procedura è una funzione
che non ha il return ed è di tipo void.
Ora che il tipo della funzione sia int, double o void è una
cosa marginale, le uniche cose che cambiano sono lo spazio 
riservato sullo stack per il valore che restituisce la 
funzione (se è void non viene sprecato spazio) e l'eventuale
warning che viene generato se di tenta di usare il valore 
della funzione.

 della funzione.
A me risulta essere molto più semplicemente una estensione non standard 
del gcc, che ci mette un return farlocco.
Ed infatti se metti -std=c99 si incavola e non compila.
La mia esperienza è per il c, ma penso che per il c++ valga la stessa cosa.

 cosa.
Appunto.

mallin.shetland ha scritto:

al massimo un warning:
#include <iostream>
using namespace std;
int two_ints(int a = 1, int b = 4);
int main(int argc, char** argv)
{
  cout << two_ints() << "\n";
  cout << two_ints(20) << "\n";;
  cout << two_ints(20, 5) << "\n";;
	return 0;
}
int two_ints(int a, int b)
{
	a+b;
}
compilato con std=c++98:
g++ -Wall -std=c++98 tmp.cxx
tmp.cxx: In function 'int two_ints(int, int)':
tmp.cxx:18: warning: statement has no effect
tmp.cxx:19: warning: control reaches end of non-void function
senza il warning all non batte ciglio, mallin.shetland ha ragione.

 della funzione.
Si, ma mi aspettavo (visto che una funzione diversa da void DEVE avere
un pezzo in più) che mi fornisse un errore. Almeno mi pare
ragionevole.
--
Ciao Neo

 ragionevole.
"void" è un tipo non una funzione; penso che tu intendevi 
dire "funzione di tipo diverso da void".
Ti ricordo le prime versioni del C (almeno fino alla 
seconda edizione del K&R) non avevano il tipo void. Le
funzioni per default sono di tipo int e le procedure non 
esistono; per nostra convenzione (e per uniformità con
altri linguaggi, come il Pascal) diciamo che una procedura
è una funzione che non ritorna alcun valore ma sia chiaro 
che è una nostra convenzione, per il C questo non esiste.
Per il C è il return alla fine di una è facoltativo perché è
implicito nella struttura delle istruzioni della funzione e così
è facoltativo l'argomento del return perchè a volte ci 
interessa questo valore (p.e. la funzione sin) altre volte 
non ci interessa (p.e. la funzione printf o scanf). 
Questa è la filosofia del C: il linguaggio fornisce i 
costrutti e strumenti base senza fronzoli poi è compito del
programmatore usare nel modo giusto queste funzioni. Poi se
alcune cose sono utili vengono aggiunte, come il tipo void,
Però il C non scavalca il programmatore ed al massimo il 
compilatore (non le specifiche del linguaggio) emette un 
warning se si accorge che il programmatore è distratto.
Certo, dichiarare una una funzione di tipo double che non
ritorna nessun valore è un errore logico, usare tale valore 
è un errore semantico che produce danni al tempo di 
esecuzione ma come già detto non sono errori sintattici 
ed il C li ignora perché il programmatore sa quello che fa.
Infine la tua affermazione è opinabile. Tu dici che se 
dichiari una procedura allora non metti il return quindi
hai una istruzione in meno. Senza scendere nei 
dettagli implementativi del compilatore questo non è 
detto. dipende fortemente dal tipo di processore, dalle 
convenzioni sulla chiamata delle funzioni e dal 
compilatore. In effetti il return cosa è? È veramente una 
istruzione in più? 

 istruzione in più?
Di questo non ho la più pallida idea. Basta sapere che non è un errore
per il compilatore e che con il -Wall me lo segnala. L'altro giorno
sono diventato scemo per aiutare un ragazzo...
Grazie
--
Ciao Neo