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.