Comment utiliser un enum comme résultat de fonction

Introduction
Définir une énumeration (enum) peut avoir beaucoup de sens mais améliore surtout la lisibilité du code.
Alors, quoi de plus logique que d'utiliser un type énuméré comme paramètre ou encore comme résultat de fonction.
Mais là les choses peuvent se corser rapidement!

Un message d'erreur déstabilisant
Si vous déclarer une énumération pour l'utiliser dans le même fichier source... comme ci-dessous:
enum FOO { un, deux };

enum FOO uneVariable = deux;

enum FOO getvaleur(){
    enum FOO temp = un;
    temp = deux;
    return temp;
}

Vous allez vous trouver confronter au message suivant:
  use of enum ‘FOO’ without previous declaration

sans compter le restant des messages d'erreur
sketch_jul23a.cpp:2: erreur: use of enum ‘FOO’ without previous declaration
sketch_jul23a.cpp:2: erreur: invalid type in declaration before ‘;’ token
sketch_jul23a.cpp: In function ‘FOO getvaleur()’:
sketch_jul23a.cpp:7: erreur: new declaration ‘FOO getvaleur()’
sketch_jul23a.cpp:2: erreur: ambiguates old declaration ‘int getvaleur()’

Pourtant, le moins que l'on puisse dire, c'est que la déclaration est bien présente juste au dessus!

La solution
Il n'y a pourtant rien d'incorrect, il s'agit seulement d'une limitation du compilateur.
En furetant sur le forum Arduino, j'ai trouvé cette page sur le playground qui explique que lorsque l'on souhaite utiliser une énumération comme paramètre, il faut la placer dans un fichier ".h" dans nouveau volet (tab) et en faire un include.

J'ai donc placé la déclaration de l'énumération dans un fichier foos.h
//Contennu de foos.h
enum FOO { un, deux };
Le code principal devient:
#include "foos.h";

enum FOO uneVariable = deux;

enum FOO getvaleur(){
    enum FOO temp = un;
    temp = deux;
    return temp;
}

Et cette fois, tout roule comme sur des roulettes :-)

2 commentaires:

  1. Merci,

    c'est un point sur lequel on peux rester bloquer un moment avant de trouver la solution !

    Un problème similaire est le warning récalcitrant lors de l'utilisation du PROGMEM que l'on enlève en ajoutant la redéfinition ci-dessous au début du fichier:
    --------------------------------
    #ifdef PROGMEM
    #undef PROGMEM
    #define PROGMEM __attribute__((section(".progmem.data")))
    #endif
    --------------------------------

    RépondreSupprimer
  2. Merci!!!
    J'ai cherché pendant quelques heures

    RépondreSupprimer