Givet 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 antager er en C ++ / Arduino konstant? fordi jeg ikke definerede det. Og RELAY_ON = LAV, LAV er 0x0
i den følgende funktion får jeg den følgende fejl.
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øvede også at få RelayState til at være enumklasse, men fik fejl af samme type. Her er fejlen fra VS2015 med koden vist ovenfor.
Kompilering af fejlretningsversion af “ModelRRXingStateMachine” til “Arduino / Genuino Uno” ModelRRXingStateMachine.ino: 11: 55: fejl: “RelayState” er ikke erklæret: boolsk throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState: ModelRine: Model: Model: RelayState: Model: RelayState) fejl: “CrossingZoneState” navngiver ikke en type: CrossingZoneState CheckEntrySensor (byte esp) Fejl ved kompilering af projektkilder
Jeg er ikke en professionel programmør og er ny til C ++, skriver normalt i C # eller VB.Net, så jeg er ikke sikker på, hvad compileren leder efter her, begge enums er deklareret, og en erklæres med en type. Desuden viser VS-kodeditoren n o fejl, de ovenfor viste fejl vises i fejlvinduet, når jeg prøver at bygge.
Kommentarer
- er alt dette i .ino? skitseprocessoren omorganiserer muligvis erklæringerne og slår ting op.
- Jeg bruger Visual Studio Professional 2015 og Visual Micro-tilføjelsesprogrammet til Arduino, ikke Arduino IDE
- og ja , al denne kode er fra .ino-filen
- IDE fremsender automatisk erklæringer for metoder øverst i filen, bekvemt før alle typer, du laver, bliver defineret. VS-tilføjelsesprogrammet gør det muligvis også, så alt kompilerer det samme. Flytning af koden til en separat .h-fil og inkludering af den fil forhindrer den i at omorganisere ting, hvis det var problemet.
Svar
Løsningen var at flytte enum-erklæringerne til en header-fil, da dette var et VM-tilføjelsesproblem, der løses, når de først har implementeret arduino version 1.6.8.
Tilføjelse af denne kode til en headerfil og fjernelse af den fra hovedfilen løste problemerne, og koden blev bygget og kø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 bruger du den variable tilstand uden at definere den. Desuden har du ikke deklareret funktionerne CheckEntrySensor () og throwRelayAndCheckStatus (). Når du definerer et funktion uden først at erklære det, arduino preprocessoren bygger sine egne erklæringer, men gør det ofte på en defekt måde. Dette er en af de idiosyncracies i arduino-miljøet versus en almindelig 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 undgå brugen af typedef, kan du bruge 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 godt, at du er i stand til at få koden til at kompilere, men synes at dette er en Q & Et sted og et par måneder / år fra nu er andre uerfarne blevet dovne (Ctrl + c Ctrl + v) og ikke får nogen forståelse for årsagen eller løsningen på de problemer. Kunne du således uddybe hvorfor den kompilerede og måske også nævne generel brug af
enums
på denne måde. - Type def er en C-struktur og er ikke standard i C ++ 11 og fremad og anbefales ikke til enums længere.
- Mange kodekompileringer, der ikke ‘ t gør det rigtigt eller effektivt
- @RSM: Du har ret.
- a) I funktion CheckEntrySensor () blev den variable tilstand brugt uden at være defineret.