Date le seguenti enumerazioni
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 };
Dove RELAY_OFF = HIGH, HIGH è #define HIGH 0x1 che presumo sia una costante C ++ / Arduino? perché non lho definito. E RELAY_ON = LOW, LOW è 0x0
nella funzione seguente ottengo lerrore che segue.
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; };
Ho provato a fare in modo che RelayState fosse anche una classe enum ma ricevevo errori di tipo simili. Ecco lerrore da VS2015 con il codice mostrato sopra.
Compilazione della versione di debug di “ModelRRXingStateMachine” per “Arduino / Genuino Uno” ModelRRXingStateMachine.ino: 11:55: errore: “RelayState” non è stato dichiarato: booleano throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState) ModelRRXingState) 2: ModelRRXingState errore: “CrossingZoneState” non nomina un tipo: CrossingZoneState CheckEntrySensor (byte esp) Errore durante la compilazione delle sorgenti del progetto
Non sono un programmatore professionista e sono nuovo in C ++, di solito scrivendo in C # o VB.Net, quindi non sono sicuro di cosa stia cercando il compilatore qui, entrambe le enumerazioni sono dichiarate e una è dichiarata con un tipo. Inoltre, leditor di codice VS mostra n o errori, gli errori mostrati sopra vengono visualizzati nella finestra di errore quando provo a compilare.
Commenti
- è tutto nel .ino? il preprocessore di sketch potrebbe riordinare le dichiarazioni e confondere le cose.
- Sto usando Visual Studio Professional 2015 e il componente aggiuntivo Visual Micro per Arduino, non lIDE di Arduino
- e sì , tutto questo codice proviene dal file .ino
- LIDE mette automaticamente dichiarazioni anticipate per i metodi allinizio del file, convenientemente prima che qualsiasi tipo venga definito. Anche il componente aggiuntivo VS potrebbe farlo, quindi tutto viene compilato allo stesso modo. Spostare il codice in un file .h separato e includere quel file impedirebbe di riordinare le cose se questo fosse il problema.
Risposta
La soluzione era spostare le dichiarazioni enum in un file di intestazione, poiché si trattava di un problema relativo al componente aggiuntivo della VM che verrà risolto una volta implementata la versione 1.6.8 di arduino.
Laggiunta di questo codice a un file di intestazione e la sua rimozione dal file principale hanno risolto i problemi e il codice viene compilato ed eseguito.
// 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
Risposta
Per prima cosa, stai usando la variabile state senza definirla. Inoltre, non hai dichiarato le funzioni CheckEntrySensor () e throwRelayAndCheckStatus (). Quando definisci un senza prima dichiararla, il preprocessore arduino costruisce le proprie dichiarazioni, ma spesso lo fa in modo difettoso.Questa è una delle idiosincrasie dellambiente arduino rispetto a un semplice compilatore C ++.
La seguente compilazione 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; }
Oppure, se vuoi evitare luso di typedef, puoi utilizzare quanto segue:
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; }
Commenti
- È positivo che tu sia in grado di compilare il codice, ma sembra che questo sia un Q & Un sito e tra qualche mese / anno altri inesperti mi fanno pigro (Ctrl + c Ctrl + v) e non riesco a capire la causa o la soluzione dei loro problemi. Potresti quindi approfondire il perché è stato compilato e forse menziona anche luso generale di
enums
in questo modo. - Il tipo def è un Struttura C e non è standard in C ++ 11 e successivi e non è più consigliato per le enumerazioni.
- Un sacco di compilazioni di codice, questo non ‘ t renderlo corretto o efficace
- @RSM: hai ragione.
- a) Nella funzione CheckEntrySensor (), lo stato della variabile è stato utilizzato senza essere definito.