folosind enumerări în funcții

Având în vedere următoarele enumerări

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 }; 

Unde RELAY_OFF = HIGH, HIGH este #define HIGH 0x1, care presupun că este o constantă C ++ / Arduino? deoarece nu l-am definit. Și RELAY_ON = LOW, LOW este 0x0

în următoarea funcție primesc eroarea care urmează.

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; }; 

Am încercat ca RelayState să fie și o clasă enum, dar primeam erori de tip similare. Iată eroarea de la VS2015 cu codul prezentat mai sus.

Compilarea versiunii de depanare a „ModelRRXingStateMachine” pentru „Arduino / Genuino Uno” ModelRRXingStateMachine.ino: 11: 55: error: „RelayState” nu a fost declarată: boolean throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState: ModelRach: 1) ModelRR eroare: „CrossingZoneState” nu numește un tip: CrossingZoneState CheckEntrySensor (octet esp) Eroare la compilarea surselor de proiect

Nu sunt un programator profesionist și sunt nou la C ++, de obicei scriind în C # sau VB.Net, deci nu sunt sigur ce caută compilatorul aici, ambele enumerări sunt declarate și una este declarată cu un tip. De asemenea, editorul de cod VS arată n o erori, erorile afișate mai sus apar în fereastra de eroare când încerc să construiesc.

Comentarii

  • este totul în .ino? este posibil ca preprocesorul de schiță să reordoneze declarațiile și să înșele lucrurile.
  • Folosesc Visual Studio Professional 2015 și programul de completare Visual Micro pentru Arduino, nu Arduino IDE
  • și da , tot acest cod provine din fișierul .ino.
  • IDE transmite automat declarații pentru metode în partea de sus a fișierului, în mod convenabil înainte ca orice tip pe care îl faceți să fie definit. Suplimentul VS s-ar putea să o facă și el, astfel încât totul să se compileze la fel. Mutarea codului într-un fișier .h separat și includerea acelui fișier l-ar împiedica să reordineze lucrurile dacă asta ar fi problema.

Răspuns

Soluția a fost mutarea declarațiilor enum într-un fișier antet, datorită faptului că aceasta a fost o problemă de completare VM care va fi rezolvată odată ce au implementat versiunea arduino 1.6.8.

Adăugarea acestui cod într-un fișier antet și eliminarea acestuia din fișierul principal au rezolvat problemele, iar codul se construiește și rulează.

// 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ăspuns

În primul rând, utilizați starea variabilă fără a o defini. Mai mult, nu ați declarat funcțiile CheckEntrySensor () și throwRelayAndCheckStatus (). Când definiți un funcționează fără a o declara mai întâi, preprocesorul arduino își construiește propriile declarații, dar deseori o face într-un mod defect. Aceasta este una dintre idiosincrațiile mediului arduino față de un compilator C ++ simplu.

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; } 

Sau, dacă doriți să evitați utilizarea typedef, puteți utiliza următoarele:

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; } 

Comentarii

  • Este bine că puteți obține codul de compilat, dar se pare că acesta este un Q & Un site și câteva luni / ani de acum, alți neexperimentați devin leneși (Ctrl + c Ctrl + v) și nu obțin nici o înțelegere despre cauza sau soluția problemelor de acolo. Ați putea explica astfel de ce a compilat și, de asemenea, poate menționa utilizarea generală a enums în acest mod.
  • Tipul def este un Structura C și nu este standard în C ++ 11 și versiunile ulterioare și nu mai este recomandată pentru enumerări.
  • Se compilează o mulțime de coduri, care nu ‘ t faceți-o corectă sau eficientă
  • @RSM: aveți dreptate.
  • a) În funcția CheckEntrySensor (), starea variabilă a fost utilizată fără a fi definită.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *