utilisation des énumérations dans les fonctions

Compte tenu des énumérations suivantes

enum RelayState { RELAY_OFF = HIGH, RELAY_ON = LOW }; enum class CrossingZoneState: uint8_t { CROSSINGZONE_CLEAR = 0, // no train in crossing area, also initialized state CROSSINGZONE_OCCUPIED = 1, // train detected by the entry sensor CROSSINGZONE_EXITING = 2 // train detected by the exit sensor, when sensor clears, state= Clear }; 

Où RELAY_OFF = HIGH, HIGH est #define HIGH 0x1 qui, je suppose, est une constante C ++ / Arduino? parce que je ne lai pas défini. Et RELAY_ON = LOW, LOW est 0x0

dans la fonction suivante, jobtiens lerreur qui suit.

CrossingZoneState CheckEntrySensor(uint8_t esp) { //esp, short for entry sensor pin if (digitalRead(esp) == HIGH) { state = CrossingZoneState::CROSSINGZONE_CLEAR; return state; } else if (digitalRead(esp) == LOW) { state = CrossingZoneState::CROSSINGZONE_OCCUPIED; return state; } // if the digital read errs, return the current state so it re-runs return state; }; boolean throwRelayAndCheckStatus(uint8_t relayNumber, RelayState relayState) { int testInt = 0; if (relayState == RelayState::RELAY_OFF) { testInt = 1; } digitalWrite(relayNumber, relayState); if (digitalRead(relayNumber) == testInt) { return true; }; return false; }; 

Jai essayé de faire en sorte que RelayState soit également une classe dénumération, mais jobtenais des erreurs de type similaires. Voici lerreur de VS2015 avec le code ci-dessus.

Compilation de la version de débogage de « ModelRRXingStateMachine » pour « Arduino / Genuino Uno » ModelRRXingStateMachine.ino: 11: 55: erreur: « RelayState » na pas été déclaré: boolean throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState) ModelRachine.State: 2MRXingino: erreur: « CrossingZoneState » ne nomme pas de type: CrossingZoneState CheckEntrySensor (byte esp) Erreur lors de la compilation des sources du projet

Je « ne suis pas un programmeur professionnel et je suis nouveau en C ++, généralement en écrivant en C # ou VB.Net, donc je ne suis pas sûr de ce que le compilateur recherche ici, les deux énumérations sont déclarées et une est déclarée avec un type. De plus, léditeur de code VS affiche n o erreurs, les erreurs ci-dessus apparaissent dans la fenêtre derreur lorsque jessaye de construire.

Commentaires

  • est-ce que tout cela est dans le .ino? le préprocesseur desquisse est peut-être en train de réorganiser les déclarations et de salir les choses.
  • Jutilise Visual Studio Professional 2015 et le complément Visual Micro pour Arduino, pas lIDE Arduino
  • et oui , tout ce code provient du fichier .ino
  • LEDI propose automatiquement des déclarations pour les méthodes en haut du fichier, de manière pratique avant que les types que vous créez soient définis. Le complément VS pourrait le faire aussi afin que tout soit compilé de la même manière. Déplacer le code vers un fichier .h séparé et inclure ce fichier lempêcherait de réorganiser les choses si tel était le problème.

Réponse

La solution était de déplacer les déclarations dénumération dans un fichier den-tête, car il sagissait dun problème de complément VM qui sera résolu une fois quils auront implémenté la version 1.6.8 darduino.

Lajout de ce code à un fichier den-tête et sa suppression du fichier principal ont résolu les problèmes et le code se construit et sexécute.

// ModelRRCrossing.h #ifndef _MODELRRCROSSING_h #define _MODELRRCROSSING_h #if defined(ARDUINO) && ARDUINO >= 100 #include "arduino.h" #else #include "WProgram.h" #endif #pragma once // Arduino Digital I/O pin numbers for MEGA //note: digital pins 30-45 //MEGA is a MUST for this project enum { Relay1 = 30, Relay2 = 31, Relay3 = 32, Relay4 = 33, Relay5 = 34, Relay6 = 35, Relay7 = 36, Relay8 = 37, Relay9 = 38, Relay10 = 39, Relay11 = 40, Relay12 = 41, Relay13 = 42, Relay14 = 43, Relay15 = 44, Relay16 = 45 }; enum RelayState { RELAY_OFF = HIGH, RELAY_ON = LOW }; enum class CrossingZoneState : uint8_t { CROSSINGZONE_CLEAR = 0, // no train in crossing area, also initialized state CROSSINGZONE_OCCUPIED = 1, // train detected by the entry sensor CROSSINGZONE_EXITING = 2 // train detected by the exit sensor, when sensor clears, state= Clear }; #endif 

Réponse

Dune part, vous utilisez la variable state sans la définir. De plus, vous navez pas déclaré les fonctions CheckEntrySensor () et throwRelayAndCheckStatus (). Lorsque vous définissez un sans le déclarer au préalable, le préprocesseur arduino construit ses propres déclarations, mais le fait souvent de manière défectueuse. Cest lune des particularités de lenvironnement arduino par rapport à un compilateur C ++ simple.

La compilation suivante s:

enum RelayState { RELAY_OFF = HIGH, RELAY_ON = LOW }; typedef enum RelayState RelayState_t ; enum CrossingZoneState { CROSSINGZONE_CLEAR = 0, // no train in crossing area, also initialized state CROSSINGZONE_OCCUPIED = 1, // train detected by the entry sensor CROSSINGZONE_EXITING = 2 // train detected by the exit sensor, when sensor clears, state= Clear }; typedef enum CrossingZoneState CrossingZoneState_t ; CrossingZoneState_t CheckEntrySensor(uint8_t esp) ; boolean throwRelayAndCheckStatus(uint8_t relayNumber, RelayState_t relayState) ; CrossingZoneState_t CheckEntrySensor(uint8_t esp) { CrossingZoneState_t state ; //esp, short for entry sensor pin if (digitalRead(esp) == HIGH) { state = /*CrossingZoneState_t::*/CROSSINGZONE_CLEAR; return state; } else if (digitalRead(esp) == LOW) { state = /*CrossingZoneState::*/CROSSINGZONE_OCCUPIED; return state; } // if the digital read errs, return the current state so it re-runs return state; } boolean throwRelayAndCheckStatus(uint8_t relayNumber, RelayState_t relayState) { int testInt = 0; if (relayState == /*RelayState::*/RELAY_OFF) { testInt = 1; } digitalWrite(relayNumber, relayState); if (digitalRead(relayNumber) == testInt) { return true; }; return false; } 

Ou, si vous souhaitez éviter lutilisation de typedef, vous pouvez utiliser ce qui suit:

enum RelayState { RELAY_OFF = HIGH, RELAY_ON = LOW }; enum CrossingZoneState: uint8_t { CROSSINGZONE_CLEAR = 0, // no train in crossing area, also initialized state CROSSINGZONE_OCCUPIED = 1, // train detected by the entry sensor CROSSINGZONE_EXITING = 2 // train detected by the exit sensor, when sensor clears, state= Clear }; enum CrossingZoneState CheckEntrySensor(uint8_t esp) ; boolean throwRelayAndCheckStatus(uint8_t relayNumber, enum RelayState relayState) ; enum CrossingZoneState CheckEntrySensor(uint8_t esp) { enum CrossingZoneState state ; //esp, short for entry sensor pin if (digitalRead(esp) == HIGH) { state = CROSSINGZONE_CLEAR; return state; } else if (digitalRead(esp) == LOW) { state = CROSSINGZONE_OCCUPIED; return state; } // if the digital read errs, return the current state so it re-runs return state; } boolean throwRelayAndCheckStatus(uint8_t relayNumber, enum RelayState relayState) { int testInt = 0; if (relayState == RELAY_OFF) { testInt = 1; } digitalWrite(relayNumber, relayState); if (digitalRead(relayNumber) == testInt) { return true; }; return false; } 

Commentaires

  • Cest bien que vous puissiez obtenir le code à compiler, mais il semble que ce soit un Q & Un site et quelques mois / années à partir de maintenant dautres inexpérimentés, je deviens paresseux (Ctrl + c Ctrl + v) et je ne comprends pas la cause ou la solution de ces problèmes. Pourriez-vous donc expliquer pourquoi il a été compilé et peut-être aussi mentionner l’utilisation générale de enums de cette façon.
  • Type def est un Structure C et nest pas standard dans C ++ 11 et versions ultérieures et nest plus recommandé pour les énumérations.
  • Beaucoup de code compile, cela ne ‘ t rendez-le juste ou efficace
  • @RSM: Vous avez raison.
  • a) Dans la fonction CheckEntrySensor (), létat de la variable a été utilisé sans être défini.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *