Biorąc pod uwagę następujące wyliczenia
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 };
Gdzie RELAY_OFF = HIGH, HIGH to #define HIGH 0x1, co jak zakładam, jest stałą C ++ / Arduino? ponieważ nie zdefiniowałem tego. A RELAY_ON = LOW, LOW to 0x0
w poniższej funkcji pojawia się następujący błąd.
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; };
Próbowałem ustawić RelayState jako klasę wyliczeniową, ale otrzymywałem podobne błędy typu. Oto błąd z VS2015 z kodem pokazanym powyżej.
Kompilowanie wersji debugowania „ModelRRXingStateMachine” dla „Arduino / Genuino Uno” ModelRRXingStateMachine.ino: 11: 55: błąd: „RelayState” nie został zadeklarowany: boolean throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayStinoate) ModelRRine: błąd: „CrossingZoneState” nie określa typu: CrossingZoneState CheckEntrySensor (bajt esp) Błąd podczas kompilowania źródeł projektu
Nie jestem zawodowym programistą i jestem nowy do C ++, zwykle pisząc w C # lub VB.Net, więc nie jestem pewien, czego szuka kompilator w tym miejscu, obie wyliczenia są zadeklarowane, a jedna jest zadeklarowana z typem. Ponadto edytor kodu VS pokazuje n o błędy, błędy pokazane powyżej pojawiają się w oknie błędów, kiedy próbuję budować.
Komentarze
- czy to wszystko jest w .ino? preprocesor szkicu może zmienić kolejność deklaracji i zaszkodzić.
- Używam programu Visual Studio Professional 2015 i dodatku Visual Micro dla Arduino, a nie Arduino IDE.
- i tak , cały ten kod pochodzi z pliku .ino
- IDE automatycznie wysyła deklaracje metod na początku pliku, dogodnie przed zdefiniowaniem jakichkolwiek typów, które utworzysz. Dodatek VS może też to zrobić, więc wszystko kompiluje się tak samo. Przeniesienie kodu do oddzielnego pliku .h i dołączenie tego pliku powstrzymałoby go przed zmianą kolejności rzeczy, gdyby to był problem.
Odpowiedź
Rozwiązaniem było przeniesienie deklaracji wyliczenia do pliku nagłówkowego, ponieważ był to problem z dodatkiem maszyny wirtualnej, który zostanie rozwiązany po zaimplementowaniu wersji arduino 1.6.8.
Dodanie tego kodu do pliku nagłówkowego i usunięcie go z głównego pliku rozwiązało problemy, a kod buduje się i uruchamia.
// 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
Odpowiedź
Po pierwsze, używasz stanu zmiennej bez jej definiowania. Ponadto nie zadeklarowałeś funkcji CheckEntrySensor () i throwRelayAndCheckStatus (). Podczas definiowania funkcji bez wcześniejszej deklaracji, preprocesor arduino buduje własne deklaracje, ale często robi to w sposób wadliwy.Jest to jedna z cech charakterystycznych środowiska arduino w porównaniu ze zwykłym kompilatorem C ++.
Poniższy plik kompilacji 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; }
Lub, jeśli chcesz uniknąć używania typedef, możesz użyć następującego:
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; }
Komentarze
- To dobrze, że możesz pobrać kod do kompilacji, ale wygląda na to, że jest to Q & Witryna i kilka miesięcy / lat od teraz inne niedoświadczone osoby stają się leniwe (Ctrl + c Ctrl + v) i nie rozumieją przyczyny ani rozwiązania tych problemów. Czy mógłbyś w ten sposób wyjaśnić, dlaczego został skompilowany, a także być może wspomina o ogólnym użyciu
enums
w ten sposób. - Typ def to Struktura C i nie jest standardem w C ++ 11 i do przodu i nie jest już zalecana do wyliczeń.
- Wiele kodu kompiluje się, co nie ' t uczyń to właściwym lub skutecznym
- @RSM: Masz rację.
- a) W funkcji CheckEntrySensor () stan zmiennej został użyty bez zdefiniowania.