använder enums i funktioner

Med tanke på följande enums

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

Where RELAY_OFF = HIGH, HIGH är #define HIGH 0x1 vilket jag antar är en C ++ / Arduino-konstant? eftersom jag inte definierade det. Och RELAY_ON = LOW, LOW är 0x0

i följande funktion får jag följande fel.

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

Jag försökte att RelayState också skulle vara enumsklass men fick liknande typfel. Här är felet från VS2015 med koden som visas ovan.

Sammanställa felsökningsversion av ”ModelRRXingStateMachine” för ”Arduino / Genuino Uno” ModelRRXingStateMachine.ino: 11: 55: fel: ”RelayState” har inte förklarats: boolean throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState: ModelRine: ModelRine: Status: ModelRineState) error: ”CrossingZoneState” namnger inte en typ: CrossingZoneState CheckEntrySensor (byte esp) Fel vid sammanställning av projektkällor

Jag är inte en professionell programmerare och är ny till C ++, brukar skriva i C # eller VB.Net så jag är inte säker på vad kompilatorn letar efter här, båda enums deklareras och ett deklareras med en typ. Dessutom visar VS-kodredigeraren n o fel, felen som visas ovan dyker upp i felfönstret när jag försöker bygga.

Kommentarer

  • är allt i .ino? skissförprocessorn kan ordna om deklarationerna och göra upp saker.
  • Jag använder Visual Studio Professional 2015 och Visual Micro-tillägget för Arduino, inte Arduino IDE
  • och ja , all den här koden kommer från .ino-filen
  • IDE lägger automatiskt fram deklarationer för metoder högst upp i filen, bekvämt innan alla typer du gör definieras. VS-tillägget kan göra det också så allt kompilerar detsamma. Att flytta koden till en separat .h-fil och inkludera den filen skulle hindra den från att ordna om saker om det var problemet.

Svar

Lösningen var att flytta enumdeklarationerna till en rubrikfil, eftersom detta var ett VM-tilläggsproblem som kommer att lösas när de har implementerat arduino version 1.6.8.

Att lägga till den här koden i en rubrikfil och ta bort den från huvudfilen löste problemen och koden byggdes och körs.

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

Svar

För det första använder du det variabla tillståndet utan att definiera det. Dessutom har du inte deklarerat funktionerna CheckEntrySensor () och throwRelayAndCheckStatus (). När du definierar ett funktion utan att först förklara det, arduino-förprocessorn bygger sina egna deklarationer, men gör det ofta på ett defekt sätt. Detta är en av idiosyncraciesna i arduino-miljön kontra en vanlig C ++ -kompilator.

Följande sammanställning 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; } 

Eller om du vill undvika att använda typedef kan du använda följande:

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

Kommentarer

  • Det är bra att du kan få koden att kompilera, men verkar vara en Q & En webbplats och några månader / år framöver blir andra oerfarna sådana lata (Ctrl + c Ctrl + v) och får ingen förståelse för orsaken eller lösningen på problemen. Kan du på så sätt utarbeta varför den sammanställdes och också nämna allmän användning av enums på detta sätt.
  • Typ def är en C-struktur och är inte standard i C ++ 11 och framåt och rekommenderas inte längre för enums.
  • Många kodkompileringar, som inte ’ t gör det rätt eller effektivt
  • @RSM: Du har rätt.
  • a) I funktion CheckEntrySensor () användes det variabla tillståndet utan att det definierades.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *