Mention légal| Contact

Fonctions, comment créer et utiliser les fonctions ?

Les fonctions

Qu'est-ce qu'une fonction?

Pour commencer, vous avez déjà, peut-être sans le savoir, exploiter une fonction. Les fonctions exécutent des tâches de travail pour lesquelles elles sont dédiées. Prenons le cas de setup() et loop() qui ont pour tâche d'exécuter les instructions contenues dans leurs blocs {}. Plus précisément,  loop() a pour tâche de réitérer en boucle l'exécution des instructions et setup() de les exécuter une seule fois.

Bien évidemment, vous savez que loop(){} est la fonction principale du programme à l’intérieur de laquelle, nous utilisons d'autres fonctions.

Il y a bien sûr les fonctions pré-définies dans L'IDE telles que for(), switch(), ou digitalWrite(); que nous utilisons souvent.

N'oublions pas non plus, les classes qui ont aussi des "fonctions" accessibles depuis l'IDE comme par exemple la classe Serial et sa fonction begin() qui permet de configurer le port série Serial.begin();

Et pour finir, les fonctions pré-définies par les bibliothèques comme par exemple <Servo.h> qui nous apporte au travers des objets qui leurs sont rattachés des fonctions comme par exemple servo.write(paramètres);  ici "servo" est notre objet et il utilise la fonction write();

Nous comprenons ainsi qu'elles sont utiles pour l'exécution de tâches répétitives et évitent alors la réécriture des lignes de codes à chaque fois que se présente une tâche.

Mais l'aspect le plus important d'une fonction lorsque l'on fait appelle à elle, c'est que nous attendons un retour de résultat à la fin de son accomplissement.

De plus, il vous est possible de réaliser des fonctions qui vous sont propres. Il existe différentes façons de les construire! C'est cela que nous allons voir! Comment les construire et quelles sont  leurs particularités !

Un peu de patience !

Comment se construit une fonction?

Elle se présente sous cette forme.

Type de fonction Nom de la fonction (paramètre1,paramètre2, ..., ) { Bloc d'instruction de la fonction} //Format d'une fonction.

Format de fonction

Nous voyons ci-dessus qu'il faut définir un type à nos fonctions.

Que veut dire void ?  Cela veut dire "vide" et signifie qu'une fonction de ce  type ne renvoie aucune valeur. Elle sont dites muettes. Patientez un peu, pour en savoir plus sur le renvoi des valeurs nous l'aborderons plus tard.

Il est courant de trouver void entre les parenthèses d'une fonction pour simplement dans ce cas indiquer qu'elle n'a aucun paramètre.  type fonction (void); .

Pour en revenir au  type d'une fonction, il dépendra de la valeur attendue par vous, c'est à vous de le définir. Une fonction typée  int renverra systématiquement une valeur de ce type. Par défaut, le programme renverra en type int.

Exemples de type de fonction . Exemple de fonction typés

Notre exemple ci-dessus, illustre également qu'il faut donner un nom symbolique à une fonction. Dans notre exemple c'est "fonction" mais pour une fonction que vous créerez vous-même, c'est à vous de choisir le nom le plus judicieux rattaché à son utilité.

Parlons à présent des paramètres contenus entre parenthèses ! Ils définissent par leurs valeurs le résultat attendu par le traitement de la fonction. Voici un exemple. 03-fonctions

Vous constatez qu'il faut également indiquer un type à nos paramètres. Ils seront utiles et exploités dans le bloc {} de la fonction pour exécuter sa tâche. Le bloc est la zone de traitement des instructions qui y seront inscrites. Dans ce bloc, vous pouvez déclarer des variables qui seront locales à notre fonction.

Maintenant que l'on connaît la construction d'une fonction, on peut passer à son exploitation et à son utilisation.

Comment déclarer et appeler une fonction ?

Tout d'abord, pour la créer, comme une variable, une fonction doit être "déclarée". Son appel doit être possible à tout moment de notre programme et vous comprendrez qu'elle soit déclarée de façon globale.

C'est-à- dire que cela se fera en dehors de la fonction loop() et de toutes autres fonctions. L'emplacement avant ou après est possible, c'est à vous d'adopter celle qui vous convient. De préférence et par clarté de lecture programme nous préférons les placer après la fonction loop().

Nous y voici ! Créons notre première fonction! Nous l’appellerons "fonction".

Déclarer sa fonction.

D'abord "Déclarons" , après la boucle loop() notre fonction en type void et sans paramètres. Enfin, nous lui  donnons comme instruction d'envoyer un message au moniteur série.

04-fonctions

Comme on pouvait s'y attendre...!  Si vous tentez de téléverser le programme; à ce stade il ne se passera rien! Effectivement,  une fonction doit être appelée pour qu'elle s’exécute. On dit faire appel de la fonction et cela se passe dans le programme principal loop().

Appeler sa fonction.

Il faut tout d'abord connaître de quelle manière on l'appelle. Il suffit d'inscrire le nom de la fonction suivi de ses parenthèses "()" et ponctuer d'un point virgule ";" dans le bloc {} de la fonction loop(). Pour être plus précis, ci-dessous un schéma d'appel de la fonction.

14-fonctions

Voir l' exemple ci-dessous.

Notez que nous utiliserons while(1); pour une lecture plus confortable au moniteur série. Vous pouvez maintenant téléverser le programme et voir le résultat.

06-fonctions

La fonction s’exécute, c'est déjà un bon début ! Voyons maintenant comment l'exploiter!

Comment exploiter une fonction?

Retour de fonction.

Bien évidemment, vous attendrez de ces dernières qu'elles vous renvoient le résultat de leur travail pour ensuite l'exploiter. Pour récupérer et manipuler la donnée d'une fonction après l'avoir appelé, il va nous falloir une variable pour la stocker.

L'aspect le plus spécifique du retour de fonction est qu'il doit être ordonné par une instruction qui s’appelle return(); .

return(Paramètre de retour); //Instruction de renvoi de données.07-fonctions

Dans un premier temps, commençons par examiner notre fonction. Il va nous falloir une valeur à retourner, ce qui implique une variable qui la contienne. Puis, nous l'intégrerons comme paramètre à return().

En second temps,  déclarons une variable pour stocker le retour de la fonction puis affichons le résultat de cette valeur au moniteur série.

08-fonctions

Malgré cela vous allez constater, lors du téléversement, que le résultat est une erreur signalée par le compilateur.

09-fonctions

Valeur nulle car elle devrait être ignorée. Voilà ce que nous dit le compilateur. 

10-fonctions

Comme nous l'avons dit en début de tutoriel, une fonction de type void ne peut pas retourner de valeur . D'autres messages apparaissent plus bas qui nous indiquent qu'une fonction void ne peut pas accepter le terme return(); car inadapté pour une fonction qui n'est pas faite (typée) pour renvoyer une valeur.

En conclusion, une fonction de type void ne fait qu’exécuter des instructions comme la fonction void loop().

Exploiter une fonction.

Enfin nous y voici !!! Pour qu'une fonction nous retourne une valeur, il va nous falloir lui attribuer un type autre que void. Le type int par exemple est le plus simple pour commencer et comprendre le principe. En conséquence, nous modifions le type de notre fonction par int. Puis, on regarde le résultat au moniteur !!

12-fonctions

Tout se déroule comme prévu. La fonction s’exécute et nous retourne sa valeur de retour.

Mais, en réalité, il existe un moyen plus simple d'exploiter le retour des fonctions. Plus précisément,  il n'est pas utile dans tous les cas d'utiliser une variable de stockage. Par exemple, pour afficher la valeur de retour au moniteur, il suffit de l'inscrire comme paramètre à la fonction print();. Inspectez ci-dessous la variante de notre programme d'origine.

13-fonctions

Après cela vous constaterez qu'avec moins de ligne; le programme devient plus simplifié et surtout, nous sommes à présent capable d'obtenir le retour d'une fonction.

Comment créer une fonction paramétrée?

Un aspect plus spécifique des fonctions est de pouvoir admettre des valeurs extérieures à elles-mêmes par le biais de leurs paramètres dit formels. Elle vont ensuite nous retourner une donnée finale en fonction des valeurs données en paramètres exploités dans leurs blocs.

Ça y est nous y sommes !!

Premièrement, déclarons les paramètres entre les parenthèses "()" de la fonction en leur spécifiant un type de données. De toute évidence, cela se fera dans la partie "déclarative" de la fonction.

Exemple:

15-fonctions

Ci-dessus, nous avons déclaré trois variables de type int .

Mais que faire de nos paramètres au sein de la fonction ? Et bien? ce que l'on en veut ! On peut  les additionner, les soustraire ou autres. On peut aussi les utiliser dans un conditionnement if(). Nous constatons ici que la fonction est un sous programme.

Tout d'abord, il faut comprendre que les paramètres sont utiles pour intégrer à volonté des valeurs extérieures à la fonction. Ces derniers sont renseignés depuis le programme principal de façon "Manuelle ou Systématique", via des variables.

16-fonctions

Au travers des fonctions standards de l'IDE, vous savez déjà renseigner des fonctions de façon manuelle donc nous passerons de suite à la manière Systématique. Pour notre exemple, nous ferons un calcul simple.

Comment utiliser les paramètres ?

L'exploitation des paramètres se fera depuis le programme principal et avant toutes choses nous créons trois variables qui contiendront les valeurs (données) à manipuler. Puis nous intégrons ces variables en  paramètres à notre fonction. Comme ci-dessous.

17-fonctions

Voici le résultat ! Amusez-vous à changer les valeurs dans les variables !

18-fonctions

Bravo !

A partir de là, vous commencerez à penser à vos programmes d'une façon différente. Il faut s'imaginer que votre programme et comme une poupée russe.

NOTE D'EXPLOITATION:

  • Il faut savoir que lorsque l'on crée une fonction paramétrée, les variables affectées au paramètres doivent avoir des noms symboliques à leurs exploitations. Prenons le cas de notre exemple, si le premier paramètre est un coefficient, il est judicieux de lui donner un nom du genre "coef". Notre exemple illustre bien que si l'on inverse les variables, le résultat ne sera pas le même. L'utilisation de plusieurs paramètres demande donc une certaine organisation.
  • Bien sûr, il est tout à fait possible -et vous serez tenté- de créer des retours de fonctions en utilisant des variables globales mais cette méthode vous demandera un appel systématique de ces dernières, à chaque besoin et de prendre garde de ne pas vous emmêler les pinceaux avec la multitudes de variables que vous pourrez en "sortir". Par principe de clarté logique et à juste titre par return(), nous partons du principe qu'une fonction n'a de retour qu'une seule donnée utile.

Une fonction pour une fonction !

L'utilisation d'une fonction comme paramètre est également possible. Là, on entre dans une dimension autre ! Etant donné qu'une fonction retourne une donnée, cette dernière peut être exploitée par un paramètre. Je vous invite à faire l'essai avec l'exemple ci-dessous. Remarquez que nous l'avons déjà fait avec la fonction de Serial.println();

19-fonctions

Le résultat est le suivant. Nous retrouvons alors trois fonctions imbriquées les unes dans les autres par leurs appels. Le principe de poupée russe devient parlant maintenant.

20-fonctions

Une fonction tentaculaire !

Imaginez ce que vous pourrez faire à l'aide d'un tableau et de vos paramètres !! Considérons, par exemple, que notre fonction gère trois éléments différents. En supposant que chaque élément possède un tableau de données qui lui est propre.

Notre fonction va traiter et attribuer une valeur à chaque élément en fonction de ces données propres. Prenons notre fonction de base et essayons!

21-fonctions

Nous avons de ce fait, répété trois fois la même action pour trois éléments différents de données différentes. Et le résultat est évidemment différent.

22-fonctions

A condition de bien s'organiser, cela ouvre des possibilités sans limites. Nous pourrions aller plus loin en créant un programme qui générerait automatiquement les données du tableau de chaque éléments par l'acquisition de signaux d'entrées analogiques ou autres, transmise à des variables propres à chaque tableau. Voyez ci-dessous une ébauche de ce que cela pourrait donner. Nous vous laissons l'exercice de créer des variables de votre cru pour exploiter cette solution. A vous de jouer !!

23-fonctions

Vous connaissez à présent  les bases et les outils utiles pour comprendre, créer et exploiter vos propres fonctions. Nous vous invitons à télécharger les sketchs référents à ce tutoriel pour une mise en pratique.

Merci.

PlaisirArduino.fr

FIN.


Recevez gratuitement les codes sources de PlaisirArduino

Amusez-vous tout de suite avec les entrées/sorties de votre carte Arduino Uno

Vous y retrouverez : des scketchs, des schémas et des PDF