fbpixel
Étiquettes : ,

En programmation, il est très courant voir nécessaire de faire appel à des fonctions qui nécessite une définition particulière. C’est d’autant plus vrai lorsque des blocs de codes se répètent dans un même programme. Un ensemble de fonction et d’objet sont généralement rassemblé dans des librairies. Nous allons voir dans ce tutoriel la définition de fonction en C appliquée à Arduino.

Syntaxe pour la définition de fonction en C

La syntaxe de la définition d’une fonction en C est constitué de 4 parties:

  • le type de variable retourné par la fonction (void,int, char , etc.)
  • le nom de la fonction
  • les arguments (facultatif)
  • le corps de la fonction
bool nom_fonction(int arg1, char arg2){
  bool out; //definition variable locale
  //corps de la fonction
  return out;
}

Le type de la fonction, son nom et la définition des arguments correspondent au prototype de la fonction, c’est à dire, aux informations minimum à connaître pour pouvoir appeler la fonction.

resultat = nom_fonction(param1,param2);

Exemples

int convert(int val){
  return map(val,0,1023,-100,100);
}


bool isValid(int val){
  if(val>-5 && val<50){
    return true; 
  }else{
    return false;
  }
}


int increment(int val, int increment,int maxval, int minval){
  val+=increment;
  if(val>maxval) val=minval;
  if(val<minval) val=maxval;

  return val;
}


On appelle une fonction qui ne retourne pas de valeur une procédure, elle est caractérisée par un type void (vide en Français).

int myVar=0;

void setup(){
  Serial.begin(115200);
}

void loop(){
   printVar("myVar",myVar);
   myVar+=1;
   delay(500);
}

void printVar(String nom, int val){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.println(val); 
}

>> myVar: 0
>> myVar: 1
>> myVar: 2
>> myVar: 3
>> myVar: 4
>> myVar: 5
>> myVar: 6
>> myVar: 7
>> myVar: 8
>> myVar: 9
>> myVar: 10

A retenir sur la définition de fonction en C

  • définir un type de variable retournée est obligatoire
  • si la fonction n’a pas de valeur retournée, on l’appelle procédure et son type est void
  • une fonction retourne une variable en faisant appel à la fonction return
  • les arguments sont définis par le type et le nom utilisé dans la fonction
  • les arguments sont facultatifs
  • le corps de la fonction se trouve entre accolade

Bonus

Définition d’argument avec des valeurs par défaut

Il est possible lors de la définition de fonction de définir une valeur par défaut d’un ou plusieurs paramètres. Sous Arduino, pour pouvoir compiler une telle fonction, il vous faudra rajouter le prototype de la fonction (ou la définition entière) avant la première utilisation de la fonction.

Au début du fichier, nous définissons le prototype de la fonction en spécifiant la valeur par défaut.

void printVar(String nom, int val, String unit="");

Puis, à la suite ou à un autre endroit, nous ajoutons la définition de la fonction sans les valeurs par défaut

void printVar(String nom, int val, String unit){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.print(val);
  Serial.print(F(" "));Serial.print(unit);
  Serial.println();
}

Il est ensuite possible d’utiliser la fonction avec ou sans le paramètre afin d’obtenir des comportements différents

   printVar("myVar",myVar);
   printVar("cmVar",cmVar,"cm");

int myVar=0;
int cmVar=0;

void printVar(String nom, int val, String unit="");

void setup(){
  Serial.begin(115200);
}

void loop(){
   printVar("myVar",myVar);
   printVar("cmVar",cmVar,"cm");
   
   myVar+=1;
   cmVar+=5;
   delay(1000);
}

void printVar(String nom, int val, String unit){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.print(val);
  Serial.print(F(" "));Serial.print(unit);
  Serial.println();
}

Surcharge de fonction

Il est possible de définir plusieurs prototype afin qu’une fonction avec un même nom puisse agir sur des paramètres de type différents. Pour surcharger une fonction, il nous faut déclarer la fonction pour chaque liste de paramètre désiré avec des prototype et des corps différents

N.B.: Notez bien que la surcharge de fonction n’est possible qu’avec des liste d’arguments différentes.

int myVar=0;
int cmVar=0;

void printVar(String nom, int val, String unit="");
void printVar(String nom, String mot, String unit="'");

void setup(){
  Serial.begin(115200);
}

void loop(){
   printVar("myVar",myVar);
   printVar("cmVar",cmVar,"cm");
   printVar("cmVar","HelloWorld");
   myVar+=1;
   cmVar+=5;
   delay(1000);
}

void printVar(String nom, int val, String unit){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.print(val);
  Serial.print(F(" "));Serial.print(unit);
  Serial.println();
}

void printVar(String nom, String mot,String unit){
  Serial.print(F(">> "));Serial.print(nom);Serial.print(F(": "));Serial.print(unit);Serial.print(mot);
  Serial.print(unit);
  Serial.println();
}

>> myVar: 3 
>> cmVar: 15 cm
>> Text -> 'HelloWorld'
>> myVar: 4 
>> cmVar: 20 cm
>> Text -> 'HelloWorld'
>> myVar: 5 
>> cmVar: 25 cm
>> Text -> 'HelloWorld'
>> myVar: 6 
>> cmVar: 30 cm
>> Text -> 'HelloWorld'
>> myVar: 7 
>> cmVar: 35 cm
>> Text -> 'HelloWorld'

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie