Go Down

Topic: [Résolu] utilisation des "enum" non supportée ?! (Read 2363 times) previous topic - next topic

Zorro_X

Apr 19, 2015, 10:17 am Last Edit: Apr 19, 2015, 11:37 am by Zorro_X
bonjour à tous,
Je tente d'utiliser les types énumérés (enum) dans mon code arduino, un petit exemple :
Code: [Select]

// déclaration C++
enum lettres
{
   A,
   B,
   C,
};

// déclaration C
typedef enum _suite
{
  D,
  E,
  F,
}suite;

void maFonctionLettres(lettres la_lettre)
{
}

void maFonctionSuite(suite la_suite)
{
}


Dans les deux cas j'obtiens une erreur du même type :
Code: [Select]

sketch_apr19d.ino:2:18: error: variable or field 'maFonctionLettres' declared void
sketch_apr19d.ino:2:18: error: ' la_lettre' was not declared in this scope
sketch_apr19d.ino:2:18: error: variable or field 'maFonctionSuite' declared void
sketch_apr19d.ino:2:18: error: 'la_suite' was not declared in this scope
Error compiling


J'en déduis que le type enum n'est pas supporté (!?) ou alors il y a une astuce spécifique aux arduinos (?)   :smiley-neutral:

Zorro_X

Pour info, j'essayais le tuto vidéo https://www.youtube.com/watch?v=tdexkAEfHg0
Voici un code qui fonctionne, mais du coup j'ai du enlever mes "enum" pour que ca tourne... :(
Code: [Select]

int DIGIT_0 = 0;
int DIGIT_1 = 1;
int DIGIT_2 = 2;
int DIGIT_3 = 3;
int DIGIT_4 = 4;
int DIGIT_5 = 5;
int DIGIT_6 = 6;
int DIGIT_7 = 7;
int DIGIT_8 = 8;
int DIGIT_9 = 9;
int DIGIT_TEST = 10; 
int DIGIT_NB = 11;

int MAP_A = 0;
int MAP_B = 1;
int MAP_C = 2;
int MAP_D = 3;
int MAP_E = 4;
int MAP_F = 5;
int MAP_G = 6;
int MAP_H = 7;
int MAP_NB = 8;


unsigned char glb_ttuc_digits[11][8]
{
  /*  A      B      C      D      E      F      G      H  */
  {  HIGH,  HIGH,  HIGH,  HIGH,  HIGH,   LOW,  HIGH,   LOW },  // 0
  {   LOW,   LOW,   LOW,   LOW,  HIGH,   LOW,  HIGH,   LOW },  // 1
  {  HIGH,   LOW,  HIGH,  HIGH,  HIGH,  HIGH,   LOW,   LOW },  // 2
  {  HIGH,   LOW,   LOW,  HIGH,  HIGH,  HIGH,  HIGH,   LOW },  // 3
  {   LOW,  HIGH,   LOW,   LOW,  HIGH,  HIGH,  HIGH,   LOW },  // 4
  {  HIGH,  HIGH,   LOW,  HIGH,   LOW,  HIGH,  HIGH,   LOW },  // 5
  {  HIGH,  HIGH,  HIGH,  HIGH,   LOW,  HIGH,  HIGH,   LOW },  // 6
  {  HIGH,   LOW,   LOW,   LOW,  HIGH,   LOW,  HIGH,   LOW },  // 7
  {  HIGH,  HIGH,  HIGH,  HIGH,  HIGH,  HIGH,  HIGH,   LOW },  // 8
  {  HIGH,  HIGH,   LOW,  HIGH,  HIGH,  HIGH,  HIGH,   LOW },  // 9
  {  HIGH,  HIGH,  HIGH,  HIGH,  HIGH,  HIGH,  HIGH,  HIGH },  // TEST
};

int glb_ti_map[8]
{
  2, // A
  3, // B
  5, // C
  6, // D
  4, // E
  7, // F
  9, // G
  8, // H
};

void display_digit(int par_e_digit)
{
  for( int loc_i_segment = 0; loc_i_segment < MAP_NB; loc_i_segment++ )
  {
    digitalWrite( glb_ti_map[loc_i_segment], glb_ttuc_digits[par_e_digit][loc_i_segment] );
  }
}

int glb_i_digit;

void setup()
{
  for( int loc_i_segment = 0; loc_i_segment < MAP_NB; loc_i_segment++ )
  {
    pinMode( glb_ti_map[loc_i_segment], OUTPUT );
  }
  glb_i_digit = 0; 
}


void loop()
{
  display_digit(glb_i_digit);
  delay(1000);
  glb_i_digit = (glb_i_digit + 1) % 10;
}

icare

#2
Apr 19, 2015, 10:39 am Last Edit: Apr 19, 2015, 10:47 am by icare Reason: complément
Bonjour,
Les enum fonctionne avec Arduino mais il me semble que dans certaines versions de l'IDE, il fallait les déclarer dans un fichier externe.
Peut être une piste
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

Heloderma-kris

+1 avec Icare cree des fichier .h a l'exterieur du scketch est ça marchera exemple dans une de mes lib
Code: [Select]

enum clef// defini des enumeration pour les selecteur d'action type get ou set
{

    AUCUN=0,LUMFLUO=1,CHAUF=2,LUMUV=3,BRUM=4,TEMPJ=5,
    TEMPN=6,TEMPJM=7,TEMPNM=8,HON=9,HOFF=10, SAISON=11,
    EPHE=12, MAN=13,CAL=14,HONM=15,HOFFM=16,VENTIL=17
};


tu inclu ensuite ta lib dans ton sketch

Zorro_X

ah ! cool !
Merci pour l'info ! je vérifie ça de suite !

fdufnews

#5
Apr 19, 2015, 11:04 am Last Edit: Apr 19, 2015, 11:06 am by fdufnews
Le problème vient de la manière dont l'IDE manipule le .ino.
Voilà un source
Code: [Select]
enum maListe{elem1,elem2,elem3};
typedef enum liste{val1,val2,val3} valeur;

int value;

int maFonction(valeur nombre){
  return(nombre);
}

void setup(void){
  
  value = elem1;
  int value2=maFonction(val1);
}

void loop(void){
}


Voilà le fichier réellement compilé
Code: [Select]
#line 1 "sketch_apr19a.ino"
#include "Arduino.h"
int maFonction(valeur nombre);
void setup(void);
void loop(void);
#line 1
enum maListe{elem1,elem2,elem3};
typedef enum liste{val1,val2,val3} valeur;

int value;

int maFonction(valeur nombre){
  return(nombre);
}

void setup(void){
  
  value = elem1;
  int value2=maFonction(val1);
}

void loop(void){
}


On voit que le prototype des fonctions est ramené au début du fichier AVANT la déclaration des enum.
En déclarant les enum dans un .h distinct cette déclaration se retrouve placée avant le prototype des fonctions et tout rentre dans l'ordre.

Zorro_X

#6
Apr 19, 2015, 11:24 am Last Edit: Apr 19, 2015, 11:39 am by Zorro_X
merci beaucoup fdufnews, tu réponds à ce qui allait être ma prochaine question : "pourquoi dans le .ino ca ne fonctionne pas comme dans un fichier C/C++ normal ?"

Du coup, tout s'explique et tout est clair maintenant ! La leçon que j'en tire c'est que le .ino il faut finalement l'utiliser comme simple "main" et n'y mettre que des appels aux fonctions de classes C++ ou fonctions C déclarées dans des fichiers standards. Le mécanisme des .ino étant fait surtout pour simplifier la vie des débutants peut être perturbant lorsqu'on a déjà l'habitude des mécanismes standards... :)

Encore merci !

LucRol

Avec la version 1.7.8 de l'IDE Arduino les enum sont correctement supportés.
Le code suivant compile correctement :

Code: [Select]

// déclaration C++
enum lettres:byte { A, B, C };
int a = 0;

void setup() {
  // put your setup code here, to run once:
  int a = A;
}

void loop() {
  // put your main code here, to run repeatedly:
  if(a == A) {
    //...
  }
}

Je m'en suis servi dans plusieurs sketch avec et sans la déclaration du type (int par défaut) ...

Go Up