Verwenden von Aufzählungen in Funktionen

Angesichts der folgenden Aufzählungen

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

Wobei RELAY_OFF = HIGH, HIGH ist #define HIGH 0x1, von dem ich annehme, dass es eine C ++ / Arduino-Konstante ist? weil ich es nicht definiert habe. Und RELAY_ON = LOW, LOW ist 0x0

in der folgenden Funktion erhalte ich den folgenden Fehler.

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

Ich habe versucht, RelayState auch als Enum-Klasse zu verwenden, habe jedoch ähnliche Typfehler erhalten. Hier ist der Fehler von VS2015 mit dem oben gezeigten Code.

Kompilieren der Debug-Version von „ModelRRXingStateMachine“ für „Arduino / Genuino Uno“ ModelRRXingStateMachine.ino: 11: 55: Fehler: „RelayState“ wurde nicht deklariert: boolean throwRelayAndCheckStatus (uint8_t RelayNumber, RelayState RelayState: Fehler: „CrossingZoneState“ nennt keinen Typ: CrossingZoneState CheckEntrySensor (Byte esp) Fehler beim Kompilieren der Projektquellen

Ich bin kein professioneller Programmierer und neu In C ++ wird normalerweise in C # oder VB.Net geschrieben, sodass ich nicht sicher bin, wonach der Compiler hier sucht. Beide Aufzählungen werden deklariert und eine mit einem Typ deklariert. Außerdem zeigt der VS-Code-Editor n an o Fehler, die oben gezeigten Fehler werden im Fehlerfenster angezeigt, wenn ich versuche zu erstellen.

Kommentare

  • Ist das alles in der .ino? Der Sketch-Präprozessor ordnet möglicherweise die Deklarationen neu an und bringt die Dinge durcheinander.
  • Ich verwende Visual Studio Professional 2015 und das Visual Micro-Add-In für Arduino, nicht die Arduino-IDE
  • und ja Der gesamte Code stammt aus der INO-Datei.
  • Die IDE gibt automatisch Deklarationen für Methoden oben in der Datei aus, bevor alle von Ihnen festgelegten Typen definiert werden. Das VS-Add-In kann dies auch tun, sodass alles gleich kompiliert wird. Das Verschieben des Codes in eine separate .h-Datei und das Einschließen dieser Datei würde verhindern, dass Dinge neu angeordnet werden, wenn dies das Problem wäre.

Antwort

Die Lösung bestand darin, die Enum-Deklarationen in eine Header-Datei zu verschieben, da es sich um ein VM-Add-In-Problem handelte, das behoben wird, sobald Arduino Version 1.6.8 implementiert wurde.

Durch Hinzufügen dieses Codes zu einer Header-Datei und Entfernen aus der Hauptdatei wurden die Probleme behoben und der Code erstellt und ausgeführt.

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

Antwort

Zum einen verwenden Sie den Variablenstatus, ohne ihn zu definieren. Außerdem haben Sie die Funktionen CheckEntrySensor () und throwRelayAndCheckStatus () nicht deklariert. Wenn Sie a definieren Funktion, ohne es zuerst zu deklarieren, erstellt der Arduino-Präprozessor seine eigenen Deklarationen, tut dies jedoch häufig auf fehlerhafte Weise. Dies ist eine der Besonderheiten der Arduino-Umgebung im Vergleich zu einem einfachen C ++ – Compiler.

Die folgende Kompilierung 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; } 

Wenn Sie die Verwendung von typedef vermeiden möchten, können Sie Folgendes verwenden:

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

Kommentare

  • Es ist gut, dass Sie den Code zum Kompilieren erhalten können, aber dies scheint ein Q Eine Site und in einigen Monaten / Jahren werden andere unerfahrene faul (Strg + c Strg + v) und erhalten kein Verständnis für die Ursache oder Lösung ihrer Probleme. Könnten Sie auf diese Weise erläutern, warum es kompiliert wurde, und möglicherweise auch die allgemeine Verwendung von enums erwähnen.
  • Typ def ist a C-Struktur und ist in C ++ 11 und höher kein Standard und wird für Aufzählungen nicht mehr empfohlen.
  • Viele Codes werden kompiliert, die nicht ‚ t Machen Sie es richtig oder effektiv.
  • @RSM: Sie haben Recht.
  • a) In der Funktion CheckEntrySensor () wurde der variable Status verwendet, ohne definiert zu sein.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.