enums gebruiken in functies

Gegeven de volgende 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 }; 

Waarbij RELAY_OFF = HIGH, HIGH is #define HIGH 0x1 waarvan ik aanneem dat het een C ++ / Arduino-constante is? omdat ik het niet heb gedefinieerd. En RELAY_ON = LOW, LOW is 0x0

in de volgende functie krijg ik de volgende foutmelding.

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

Ik heb geprobeerd RelayState ook een enum-klasse te laten zijn, maar kreeg vergelijkbare typefouten. Hier is de fout van VS2015 met de bovenstaande code.

Compileren van foutopsporingsversie van “ModelRRXingStateMachine” voor “Arduino / Genuino Uno” ModelRRXingStateMachine.ino: 11:55: fout: “RelayState” is niet gedeclareerd: boolean throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState) ModelRRXing: 2 :achine 1: error: “CrossingZoneState” noemt geen type: CrossingZoneState CheckEntrySensor (byte esp) Fout bij compileren van projectbronnen

Ik “ben geen professionele programmeur en ben nieuw naar C ++, meestal schrijven in C # of VB.Net, dus ik weet niet zeker wat de compiler hier zoekt, beide enums worden gedeclareerd en één wordt gedeclareerd met een type. Ook laat de VS-code-editor n zien o fouten, worden de bovenstaande fouten weergegeven in het foutvenster wanneer ik probeer te bouwen.

Opmerkingen

  • zit dit allemaal in de .ino? de sketch preprocessor kan de declaraties opnieuw ordenen en dingen verpesten.
  • Ik gebruik Visual Studio Professional 2015 en de Visual Micro add-in voor Arduino, niet de Arduino IDE
  • en ja , al deze code komt uit het .ino-bestand.
  • De IDE plaatst automatisch declaraties voor methoden bovenaan het bestand, handig voordat de typen die je maakt, worden gedefinieerd. De VS-invoegtoepassing kan het ook doen, zodat alles hetzelfde compileert. Door de code naar een apart .h-bestand te verplaatsen en dat bestand op te nemen, zou het niet meer opnieuw ordenen als dat het probleem was.

Antwoord

De oplossing was om de enum-declaraties naar een header-bestand te verplaatsen, aangezien dit een VM-add-in-probleem was dat zal worden opgelost zodra ze arduino versie 1.6.8 hebben geïmplementeerd.

Door deze code toe te voegen aan een header-bestand en deze te verwijderen uit het hoofdbestand, zijn de problemen opgelost en de code wordt opgebouwd en uitgevoerd.

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

Antwoord

Ten eerste gebruik je de variabele state zonder deze te definiëren. Bovendien heb je de functies CheckEntrySensor () en throwRelayAndCheckStatus () niet gedeclareerd. Wanneer je een zonder het eerst te declareren, bouwt de arduino-preprocessor zijn eigen declaraties, maar doet dit vaak op een defecte manier. Dit is een van de eigenaardigheden van de arduino-omgeving versus een gewone C ++ -compiler.

De volgende compilatie 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; } 

Of, als u het gebruik van typedef wilt vermijden, kunt u het volgende gebruiken:

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

Reacties

  • Het is goed dat je de code kunt laten compileren, maar het lijkt erop dat dit een Q is & Een site en een paar maanden / jaren vanaf nu worden andere onervaren lui (Ctrl + c Ctrl + v) en krijg ik geen idee van de oorzaak of oplossing voor hun problemen. Kunt u op deze manier uitweiden over waarom het is gecompileerd en misschien ook vermeldingen van algemeen gebruik van enums.
  • Type def is een C-structuur en is niet standaard in C ++ 11 en hoger en wordt niet langer aanbevolen voor enums.
  • Veel code compileert, dat doet niet ‘ t maak het juist of effectief
  • @RSM: je hebt gelijk.
  • a) In de functie CheckEntrySensor () werd de variabele status gebruikt zonder te zijn gedefinieerd.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *