ved å bruke enums i funksjoner

Gitt følgende 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 }; 

Hvor RELAY_OFF = HIGH, HIGH er #define HIGH 0x1 som jeg antar er en C ++ / Arduino konstant? fordi jeg ikke definerte det. Og RELAY_ON = LAV, LAV er 0x0

i følgende funksjon får jeg feilen som følger.

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

Jeg prøvde å ha RelayState også i enum-klasse, men fikk feil av samme type. Her er feilen fra VS2015 med koden vist ovenfor.

Kompilere feilsøkingsversjon av «ModelRRXingStateMachine» for «Arduino / Genuino Uno» ModelRRXingStateMachine.ino: 11: 55: feil: «RelayState» er ikke erklært: boolsk throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState error: «CrossingZoneState» navngir ikke en type: CrossingZoneState CheckEntrySensor (byte esp) Feil ved kompilering av prosjektkilder

Jeg er ikke en profesjonell programmerer og er ny til C ++, skriver vanligvis i C # eller VB.Net, så jeg er ikke sikker på hva kompilatoren leter etter her, begge enumene blir deklarert og en blir erklært med en type. Også VS-kodeditor viser n o feil, feilene vist ovenfor vises i feilvinduet når jeg prøver å bygge.

Kommentarer

  • er alt i .ino? skisseprosessoren kan omorganisere erklæringer og knuse ting.
  • Jeg bruker Visual Studio Professional 2015 og Visual Micro-tillegget for Arduino, ikke Arduino IDE
  • og ja , all denne koden er fra .ino-filen
  • IDE legger automatisk fram erklæringer for metoder øverst i filen, beleilig før noen typer du lager blir definert. VS-tillegget kan gjøre det også, så alt kompilerer det samme. Hvis du flytter koden til en egen .h-fil og inkluderer den filen, vil den hindre den i å omorganisere ting hvis det var problemet.

Svar

Løsningen var å flytte enum-deklarasjonene til en header-fil, fordi dette var et VM-tilleggsproblem som vil bli løst når de har implementert arduino versjon 1.6.8.

Å legge til denne koden i en topptekstfil og fjerne den fra hovedfilen løste problemene og koden ble bygget og kjørt.

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

For det første bruker du variabeltilstanden uten å definere den. Videre har du ikke deklarert funksjonene CheckEntrySensor () og throwRelayAndCheckStatus (). Når du definerer en funksjon uten å først erklære det, arduino preprosessor bygger sine egne erklæringer, men gjør det ofte på en defekt måte. Dette er en av idiosyncracies i arduino-miljøet versus en vanlig C ++ kompilator.

Følgende kompilering 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 hvis du vil unngå bruk av typedef, kan du bruke følgende:

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 er bra at du er i stand til å få koden til å kompilere, men synes dette er en Q & Et nettsted og noen få måneder / år fra nå er andre uerfarne blitt lat (Ctrl + c Ctrl + v) og ikke får noen forståelse om årsaken eller løsningen på problemene. Kan du dermed utdype hvorfor den ble samlet, og også nevne generell bruk av enums på denne måten.
  • Type def er en C-struktur og er ikke standard i C ++ 11 og fremover og anbefales ikke for enums lenger.
  • Mange kodekompileringer, som ikke ‘ t gjør det riktig eller effektivt
  • @RSM: Du har rett.
  • a) I funksjonen CheckEntrySensor () ble den variable tilstanden brukt uten å være definert.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *