používání výčtů ve funkcích

Vzhledem k následujícím výčtem

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

Kde RELAY_OFF = HIGH, HIGH je #define HIGH 0x1, což předpokládám, že je konstanta C ++ / Arduino? protože jsem to nedefinoval. A RELAY_ON = LOW, LOW je 0x0

v následující funkci se zobrazí následující chyba.

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

Snažil jsem se mít RelayState také třídu enum, ale dostával jsem podobné chyby typu. Zde je chyba z VS2015 s výše uvedeným kódem.

Kompilace ladicí verze „ModelRRXingStateMachine“ pro „Arduino / Genuino Uno“ ModelRRXingStateMachine.ino: 11:55: chyba: „RelayState“ nebyl deklarován: boolean throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState) ModelRRXingState: 2: chyba: „CrossingZoneState“ nepojmenuje typ: CrossingZoneState CheckEntrySensor (byte esp) Chyba při kompilaci zdrojů projektu

Nejsem profesionální programátor a jsem nový do C ++, obvykle psaní v C # nebo VB.Net, takže si nejsem jistý, co zde kompilátor hledá, oba enumy jsou deklarovány a jeden je deklarován s typem. Také editor kódu VS zobrazuje n o chyby, chyby zobrazené výše se při pokusu o sestavení zobrazí v chybovém okně.

Komentáře

  • je to všechno v .ino? preprocesor skici může změnit pořadí deklarací a vyrušovat věci.
  • Používám Visual Studio Professional 2015 a doplněk Visual Micro pro Arduino, ne Arduino IDE
  • a ano , veškerý tento kód pochází ze souboru .ino
  • IDE automaticky předává deklarace pro metody v horní části souboru, pohodlně před definováním všech typů, které vytvoříte. Doplněk VS to může udělat taky, takže se vše kompiluje stejně. Přesunutí kódu do samostatného souboru .h a zahrnutí tohoto souboru by mu zastavilo změnu pořadí věcí, pokud by to byl problém.

Odpovědět

Řešením bylo přesunout deklarace výčtu do souboru záhlaví, protože se jednalo o problém s doplňkem VM, který bude vyřešen, jakmile implementují arduino verze 1.6.8.

Přidání tohoto kódu do souboru záhlaví a jeho odebrání z hlavního souboru vyřešilo problémy a kód se sestavuje a spouští.

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

Odpověď

Za prvé používáte stav proměnné, aniž byste jej definovali. Navíc jste nedeklarovali funkce CheckEntrySensor () a throwRelayAndCheckStatus (). Když definujete funkce, aniž by ji nejprve deklaroval, preprocesor arduino vytváří své vlastní deklarace, ale často tak činí vadným způsobem. Toto je jedna z idiosynkracií prostředí arduino oproti prostému kompilátoru C ++.

Následující kompilace 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; } 

Nebo, pokud se chcete vyhnout použití příkazu typedef, můžete použít následující:

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

Komentáře

  • Je dobré, že jste schopni získat kód ke kompilaci, ale zdá se, že se jedná o Q & Stránky a za pár měsíců / let od nynějška další nezkušené budou líné (Ctrl + c Ctrl + v) a nebudou rozumět příčině ani řešení problémů. Mohl byste tedy rozvinout proč , které kompiloval, a také možná zmínky o obecném použití enums tímto způsobem.
  • Type def je Struktura C a není standardní v C ++ 11 a vpřed a již se nedoporučuje pro výčty.
  • Mnoho kompilací kódu, které ‚ t udělejte to správně nebo efektivně
  • @RSM: Máte pravdu.
  • a) Ve funkci CheckEntrySensor () byl použit stav proměnné, aniž by byl definován.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *