Newsgroup: it.hobby.elettronica.digitale
Titolo: ritorno di una funzione

Leggendo i news mi e' venuta voglia di imparare il C, ho incominciato  da 
questo codice semplice, mi spieghereste perche' il valore di ritorno della 
funzione quadrati e' 45?
#include <stdio.h>
int quadrati()
{
    int loop;
   for (loop = 1; loop < 8; ++loop);
   printf("questo e' il valore della moltiplicazione %d\n",loop*loop);
  return  ;
    }
int main()
    {
     printf("\nquesto invece e' il valore di ritorno della funzione quadrati 
%d\n",quadrati());
     system ("PAUSE");
     return ;
    } 

 
perche' la sintassi giusta e' :
	return <valore> ;
dove <valore> e' il valore che si vuole ritornare ( tipicamente una 
espressione )
tieni conto che il compilatore dovrebbe dare ALMENO un warning ( i 
puristi forse direbbero addirittura un errore ) del genere:
"non void function return void value"
attento alla differenza tra funzioni che ritornano un valore e funzioni 
"void" che non ritornano un valore ( le subroutine di altri linguaggi di 
programmazione )


 funzione quadrati e' 45?
Non lo è, nel senso che quel 45 non è il valore di ritorno secondo me.
Quel codice non dovrebbe passare la compilazione perché dichiari due 
funzioni con valore di ritorno int ma restituisci void.

 programmazione )
Si intende sempre che devono ritornare un valore tipo espressione? non 
riesco a capirne l'utilita', mi sa che devo studiare ancora molto, sto 
usando il libro della Inware scritto da Antonio Di Stefano "linguaggio ANSI 
C" 

 funzioni con valore di ritorno int ma restituisci void.
Sto usando DEV-C++ 4.9.9.2, non mi da nessun warning od errore 

 Si intende sempre che devono ritornare un valore tipo espressione?
Cerca "left value" e "right value" nel C.

 
in altri linguaggi di programmazione si distingue tra "funzioni" e 
"subroutine" utilizzando differenti dichiarazioni ( SUB e FUNCTION del 
Basic PROCEDURE e FUNCTION del Fortran )
le prime ritornano un valore ( come le normali funzioni dell'analisi 
matematica ) e trovano il loro naturale uso all'interno delle espressioni,
le seconde no, limitandosi ad incapsulare un compito in modo che possa 
essere richiamato da piu' parti del programma
il C non usa parole chiave particolari per "introdurre"/"dichiarare" 
subroutine e funzioni ma le distingue in base al tipo che uno premette 
al nome dell'entita'
cosi'
int pippo() .... e' una funzione che ritorna un intero
e
void pluto() ... e' una funzione che NON ritorna nulla cioe' una subroutine
va da se che un funzione DEVE ritornare sempre qualcosa ( a meno di casi 
molto particolari) e una subroutine NON PUO' ritornare nulla
per cui nel primo caso si usa
return <espressione>;
e nel secondo caso
return ;

 ha scritto nel messaggio 
news:498dd2cf$0$744$5fc...@news.tiscali.it...

In realtà quel 45 non è un valore di ritorno, ma è semplicemente
una sequenza di bit che si trovava nella porzione di memoria allocata
per ricevere il valore di ritorno (4 byte in questo caso, perchè è un 
intero).
Probabilmente se riavvii il pc otterrai un altro valore.
Inoltre con la funzione quadrati ottieni semplicemente la stampa dei primi
7 quadrati naturali. Il return serve appunto per restituire al main UN 
valore.
P.S. Ottimo il "++loop" anzichè "loop++". Facendo il preincremento si
risparmia un pò di memoria, e su un microcontrollore a volte queste cose
possono fare la differenza :-)
Ciao
Dymios

 7 quadrati naturali.
ocio! non mi pare! ;-);

    }
Questo stampa il quadrato di 1, 2, 3, 4, 5, 6 e 7.
Ossia il quadrato dei primi 7 numeri naturali. ;-)
Ciao
Dymios 

 
il problema che ti volevo far notare è il punto e virgola alla fine 
della linea con il for!
Questa funzione stampa la stringa
questo e' il valore della moltiplicazione 64
compilare per credere ;-)
ciao
  BQ

 ha scritto nel messaggio 
news:h69ll.177629$Ca.3...@twister2.libero.it...

E' una di quelle insidie degli esercizi tipo "cosa fa questo programma?"
....mi ha fregato alla grande  ;-)
Ciao! 

 
hehe senza contare le volte che cose del genere mi hanno fregato in casi 
reali ;-)
ciao :-)

 possono fare la differenza :-)
Questo č vero in C++, ma in C, dove puoi post/pre-incrementare solo i 
tipi base, usare l'uno o l'altro č indifferente.
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org/

 tipi base, usare l'uno o l'altro č indifferente.
Non ne sarei certo. Dipende dal processore. Se ben ricordo gli AVR hanno
una qualche asimmetria, tipo che hanno istruzioni con preincremento o
postdecremento.


E' vero che alcuni processori hanno asimmetrie che vengono sfruttate 
quando usi gli operatori di post/pre-incremento all'interno di 
espressioni, ma la tesi sostenuta da Dymios era che ++i č migliore di 
i++ quando usato in modo a sé stante su una riga vuota (quale č il 
caso dell'incremento all'interno del for).
In questo caso sia ++i che i++ vengono invece semplicemente tradotti 
con l'istruzione assembly piů conveniente (INC nel caso migliore o al 
limite ADD varie).


 Cerca "left value" e "right value" nel C.
Ho cercato di decriptare la tua informazione, m anon sono riuscito a trovare 
la chiave per decodificare :-) ho trovato che in C quando si dichaira una 
variabile a prescindere dal tipo di variabile bisogna considerare un Lvalue 
che rappresenta l'indirizzo dell'elemento, mentre Rvalue e' il valore che e' 
memorizzato nella locazione di memoria rappresentato da Lvalue.
Se questo che ho imparato e' giusto, che attinenza c'e' con il ritorno di 
una funzione? 

 memorizzato nella locazione di memoria rappresentato da Lvalue.
No, non è così, anzi spessissimo gli indirizzi delle variabili non sono
affatto lvalue.
Il concetto, come suggerito dal nome, è di una banalità estrema.
Una lvalue è ciò che può stare a sinistra in un'assegnazione, ovvero una
variabile a cui puoi assegnare un valore. Quindi non è una costante nè una
combinazione di variabili.
Rvalue boh, è un termine che non conosco.

 Rvalue boh, č un termine che non conosco.
E' cioč che sta a destra nell'assegnazione, cioč l'oggetto che ha il 
valore che viene effettivamente considerato nell'assegnazione, credo che 
si intenda ciň che non č lvalue.

 una funzione? 
Ho riletto il thread e francamente non ricordo perché ho dato quel 
suggerimento, forse perché al suggerimento di passare un'espressione hai 
chiesto "del tipo a=b+c" cioè un'espressione matematica.
Nel tuo caso tu prendi il valore (un rvalue) da quadrato() ma quadrato 
non sta restituendo nulla perché return non ha argomenti. Immagino che a 
esecuzione il programma stampi un po' di sporcizia presa dallo stack.

 affatto lvalue.
Questo e' quello che ho letto 
http://www.megaupload.com/?d=PTUJ1YFS
 da 
questo ho scritto quello che compare all' inizio di questo messaggio 

 questo ho scritto quello che compare all' inizio di questo messaggio
Oops. E' vero. Lvalue è l'indirizzo in memoria, non il suo contenuto.