Général à quoi sert l'instruction "return"

  • Auteur de la discussion gégé62
  • Date de début
G

gégé62

Compagnon
bonjour,

On rencontre fréquemment "return" à la fin d'une fonction. Je cherche à comprendre à quoi elle sert. On voit souvent expliqué ainsi....cela sert à "retourner" une valeur....voire à stopper le déroulement de la fonction.

mais ça ne me parle pas, je dois avoir l'esprit tordu (comme beaucoup de mon âge ?) ou...pas assez! Ça veut dire quoi "retourner une valeur"......elle retourne où ???
le sens du verbe "retourner" est probablement un abus de langage par rapport à la vie courante (retourner d'où on vient, retourner sa veste...:wink: ???)
J'ai déjà fait quelques programmes comportant moult fonctions, je n'ai jamais utilisé "return" et apparemment ça fonctionne.

Je cherche donc à savoir ce qui se passe dans le MC au moment où apparait ce mot magique....
Par exemple si j'ai

c = a+b

la variable c possède instantanément une nouvelle valeur, égale à a+b, à quoi bon ajouter "return c" ?

Suis-je le seul à me poser cette question ?

merci d'avance
 
P

phil135

Compagnon
c'est lié à la notion de sous-programme
la fonction n'est pas forcement appelée au fil du programme principal, elle peut être utilisée depuis plusieurs endroits -> return permet de retourner là où on était
c'est surtout utile pour les fonction un peu compliquées dont l'écriture consomme un peu de place, assez de place pour qu'on n'ai pas envie de l'écrire plusieurs fois
 
N

Nomadsoul

Apprenti
Salut gégé,

Bonne question ! Cela permet de faire des chose plus complexe, mais voici un exemple avec ton exemple pour comprendre:

c= fonction(a,b)

fonction(a un entier, b un entier)
resultat= a+b
retourne resultat
fin fonction

en faite en retournant un résultat c'est comme si la fonction prenait la valeur du resultat contenu dans la fonction.
ici fonction(a,b) retourne comme résultat a+b se qui équivaut a c = a+b.
Le but étant de faire bien sure de faire des choses plus complexe. Si par exemple a et b sont des valeur qui sont lu dans un fichier ou sur un port série, mieux vaut les prendre d'une fonction. Cela permet d'appeler une fonction quand tu le souhaite et évite de réécrire toujours le même code si tu as besoin de recalculer plusieurs fois a+b.

En espérant t'avoir aidée :)

a+
 
G

gégé62

Compagnon
merci de vos réponses, je vais regarder ça de près.

je me demande aussi si je n'aurais pas dû mettre mon post dans
"Généralités sur les variables, librairies, ... pour les débutants",

au lieu de créer un nouveau fil....?

de plus, je ne sais pas comment mettre un Tag (ici: general)
 
C

chrisD

Ouvrier
Tres bonne question. Merci Gégé de l'avoir posée, car moi aussi je me demandais à quoi sert cette fonction. Merci pour vos réponses. :P
 
J

jpbbricole

Compagnon
Lundi et déjà entrain de te poser des questions fondamentales !

Fondamentalement, return sert, en fin de sous routine, dans le déroulement du programme, à lui dire de retourner à l’adresse de l’appel de cette sous routine +1 afin de continuer le déroulement.

Dans un langage structuré comme VisualBasic le return se trouve toujours en fin de sous routine et s'appelle End Sub ou End Function. Dans le langage Arduino c'est le } qui fait office.

Par contre dans le cas du langage de l'Arduino, si tu fais:

void loop()
{
int x = sousRoutine(12);
// x vaut 13 et n'est "vue" que dans loop
}

int sousRoutine(int valeur)
{
valeur ++ ; // valeur vaut 13
return(valeur) ;
valeur +=22 ; // valeur vaut 35
}

return(valeur) "fige" la valeur qui sera retournée par sousRoutine.

En principe il n'y a pas de return() dans une void sousRoutine puisque void veut dire rien ou vide.
L'attribut de sous routine peut prendre toutes les formes que la déclaration de variables:
int
string
boolean
etc
Donc le type de variable retournée pas return(), est toujours le type de la sous routine.
ouf!


Bonne journée
Jean-Pierre
 
Dernière édition:
S

speedjf37

Compagnon
int sousRoutine(int valeur)
{
valeur ++ ; // valeur vaut 13
return(valeur) ;
valeur +=22 ; // valeur vaut 35
}


return(valeur) ;

Erreur tout code situé après le return ne sera pas exécuté

valeur +=22 ; // valeur vaut 35


La valeur de retour sert très souvent à savoir si la sous-routine c'est bien passée.

result=sousRoutine(compteur);
if (result >=0) //Test OK
{
}



int sousRoutine(int valeur)
{
valeur ++ ; // +1

if (valeur> 12)
return (0);
else
return (-1);

}
 
L

lion10

Compagnon
Bonjour

La fin d'une fonction a lieu à l'occurence du mot clé "return" ou sinon de la dernière accolade de la fonction.
=> Le "return" équivaut en quelque sorte à "goto fin de la fonction".
=> Donc s'il n'y a pas de "return" la fonction est éxécutée mais elle renvoie une valeur indéfinie, c'est une erreur de codage potentielle.
=> On peut donc très bien trouver une fonction sans "return" mais quel est l'intérêt ? Il vaut mieux utiliser une procédure avec "void".

Lorsqu'il y a un "return(Z)" Z est renvoyé par la fonction. Attention Z est converti avec le type qui est indiqué dans la déclaration de la fonction :

char Z multiplie( X, Y)
char X, Y;
{ Z = X*Y;
return(Z); // erreur car risque de dépassement si X et Y font par exemple 127
}

Pour un programme clair et structuré je conseillerai de ne mettre qu'un return dans une fonction, traditionnellement à la fin.
Mais s'il s'agit d'un traitement, par exemple une sucession de test qui sont évalués l'un après l'autre et si l'on doit renvoyer une erreur au premier échec , alors pourquoi pas.

cdlt lion10
 
M

M4vrick

Compagnon
Je me permet d'apporter une petite correction à ce que vient de dire jpbbricole: "En principe il n'y a pas de return() dans une void sousRoutine puisque void veut dire rien ou vide."

Il y a deux notions différentes:
- le void avant la déclaration de la fonction (pour rester dans les standard de syntaxe arduino, on utilise pas de sous routine mais on déclare des fonctions) indique que l'on n'attends pas de valeur à la fin de l'appel de la fonction
- la fonction return(): elle permet d'interrompre une fonction avant d'en arriver à la fin, elle peux (mais ce n'est pas obligatoire) permettre de renvoyer une valeur lorsque l'on quitte la fonction. On peut très bien utiliser un test en début de fonction avec un return() pour l'interrompre en fonction du résultat du test.
 
F

Fred69

Compagnon
Lorsque l'exécution d'un sous-programme est terminée, il y a un RETOUR à l'instruction qui
suit l'appel dans le programme appelant.
Par exemple dans un calcul de TVA, on appellera un sous-programme "calcul_tva" en lui passant en paramètre le "montant" et le "taux de TVA".
En retour la tva calculée.
Voir les exemples: "Les sous-programmes", ou ici "les sous-programmes".
Fred
 
J

jpbbricole

Compagnon
Erreur tout code situé après le return ne sera pas exécuté
Oups! Exacte!

La valeur de retour sert très souvent à savoir si la sous-routine c'est bien passée.
Cette instruction return() sert surtout pour créer nos propres fonctions et sert de résultat de celle-ci.

on utilise pas de sous routine mais on déclare des fonctions)
J'ai trop fait de Visual Basic! encore de vieux restes.

Cordialement
jpbbricole
 
S

speedjf37

Compagnon
Lorsque l'exécution d'un sous-programme est terminée, il y a un RETOUR à l'instruction qui
suit l'appel dans le programme appelant.
Par exemple dans un calcul de TVA, on appellera un sous-programme "calcul_tva" en lui passant en paramètre le "montant" et le "taux de TVA".
En retour la tva calculée.
Voir les exemples: "Les sous-programmes", ou ici "les sous-programmes".
Fred

Pas d'accord !
si fonction non "void" après le retour ,on revient à l'instruction qui a provoqué l'appel et on affecte ou on teste la valeur de retour .
edit: (pas réussi a mettre barré) supression la ligne

PS) il peut y avoir plusieurs instructions sur une même ligne

JF
 
Dernière édition:
J

jpbbricole

Compagnon
si fonction non "void" après le retour ,on revient à la ligne
Que la fonction soit void ou pas, on va à l'instruction suivante. La notion de ligne n'existe pas dans ce cas de figure, la possibilité de mettre plusieurs instruction par ligne, n'est qu'une facilité offerte par le compilateur et n'entre pas dans la structure du programme et est très peu utilisée pour des raison de lisibilité du programme.

bon appétit
 
Dernière édition:
L

lion10

Compagnon
Bonjour

En résumé , "return" permet de renvoyer la valeur que l'on vient de calculer dans une fonction.
Si on ne met pas "return" la fonction ne renvoie rien et le traitement se pousuit jusqu'à la fin de la fonction. :!:
Si on met "return" elle renvoie quelque chose et arrête son traitement dés qu'on y passe.
Si plusieurs "return" sont mis c'est comme s'il y avait plusieurs portes de sortie en début du couloir et que logiciel prenait la première sortie par laquelle il passe lors de son exécution. S'il ne passe par aucune de ces portes de sortie, il est quitte à s'éxécuter jusqu'à la dernière porte de sortie qui correspond à sa fin.
Un return permet de renvoyer un code d'erreur.

Bien faire attention :
-au type calculé dans la fonction puis au type renvoyé qui est converti.:!: (Cf mon exemple)
-à ne pas oublier le return si on veut renvoyer une valeur.
-la portée des variables, si la variable est globale on n'a pas besoin de passer par une fonction pour renvoyer la valeur mais c'est moins propre.
Eviter systématiquement de mettre une variable globale permet de limiter leur visibilité, dans des logiciels plus conséquent, une fonction ne verra pas la variable qui n'est pas globale à tout le programme elle sera en partie protégée sauf gros problème du logiciel.
=> Mais c'est une notion plus avancée pour une utilisation dans un second temps si on considère un très petit logiciel amateur arduino.
Quand le logiciel est plus important avec de nombreux fichiers cette notion est indispensable.

=> Pour aller plus loin encore, il faut savoir qu'une fonction ne peut pas renvoyer n'importe quoi via son "return", si la variable est encombrante on passe par un pointeur. Mais si on considère un logiciel amateur arduino débutant il pourra se contenter de renvoyer une variable simple par exemple un "char".

-une fonction se rapproche d'une procédure ou sous programme pour rester neutre sans connation liée à d'autres languages.
La fonction renvoie quelque chose alors que la procédure ne renvoie rien.
void procedure_loikshfiqdflskh( char X, unsigned char Y) // on repèrera "void" qui ne laisse aucun doute.
int fonction_sukdgfvcqkezsjd( char Z, int W)

cdlt lion10
 
Dernière édition:
J

jpbbricole

Compagnon
E X C E L L E N T!

Merci pour cette synthèse et bonne après-midi
jpbbricole
 
G

gégé62

Compagnon
je ne pensais pas que ma question susciterait autant de réponses de qualité.
Merci à tous, je crois que je commence à piger.....
 
V

vres

Compagnon
peut-être que sur arduino c'est différent mais en C++ return peut très bien ne pas retourner de valeur et être utilisé dans une fonction void pour une sortie conditionnelle par exemple.

return n'étant pas une fonction mais une instruction on écrit plutot "return z;" que "return(z);"

personnellement un sous-programme en C ou C++ je ne sais pas trop ce que c'est.
 
Dernière édition:
G

gégé62

Compagnon
oui, d'ailleurs je pense que ce point est pour quelque chose dans ma difficulté à comprendre (normalement ça va un peu mieux maintenant :wink:) je veux dire le fait que "return" peut faire deux choses, il renvoie une valeur (je dis "renvoie" comme disent les pros, j'ai encore un peu de flou à éclaircir là-dessus....) et c'est aussi une fin d'exécution de la fonction , 2 choses qui semblent bien différentes, mais ce n'est peut-être qu'une impression.
 
V

vres

Compagnon
return sert avant tout a sortir d'une fonction et si la fonction n'est pas de type void return doit aussi retourner une valeur.


La fonction renvoie quelque chose alors que la procédure ne renvoie rien.

en pascal non seulement la procedure ne retourne pas de valeur mais en plus elle n'a pas d'argument
 
O

osiver

Compagnon
"return" peut faire deux choses, il renvoie une valeur (je dis "renvoie" comme disent les pros, j'ai encore un peu de flou à éclaircir là-dessus....) et c'est aussi une fin d'exécution de la fonction , 2 choses qui semblent bien différentes, mais ce n'est peut-être qu'une impression.
Oui, plus précisément il fait toujours une chose : la fin de la fonction et le retour à l'appelant = l'instruction qui suit celle qui a appelé la fonction. Optionnellement, il retourne en plus une valeur = résultat de l'action de la fonction, code d'erreur. :wink:

La prochaine fois on s'attaque aux pointeurs ?? :smt110
 
G

gégé62

Compagnon
oui ça a l'air pas mal, c'est téléchargé....!

Et surtout le premier tuto qui était sur le site du zéro avant d'être retiré par l'auteur suite aux bisbilles avec openclassroom :
http://eskimon.fr/category/arduino/partie-1
celui-là aussi est noté (j'avais déja Openclassroom)

merci pour les explications nombreuses à propos de "return" je pense que c'est OK pour moi maintenant (toujours prudent....:wink:)
 

Sujets similaires

Haut