A következő felsorolások alapján
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 };
Ahol RELAY_OFF = HIGH, HIGH a #define HIGH 0x1, amely feltételezem, hogy C ++ / Arduino konstans? mert nem definiáltam. És RELAY_ON = LOW, LOW 0x0
a következő függvényben a következő hibát kapom.
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óbáltam, hogy a RelayState is legyen enum osztály, de hasonló típusú hibákat kaptam. Itt van a VS2015 hibája a fent látható kóddal.
A “ModelRRXingStateMachine” hibakeresési verziójának összeállítása az “Arduino / Genuino Uno” számára ModelRRXingStateMachine.ino: 11: 55: hiba: A “RelayState” nem lett deklarálva: logikai dobRelayAndCheckStatus (uint8_t relayNumber, RelayStateRayRateStayRateStayRateStayRateStayRateStayRateStateRayRateStateRayStateRateStayRayState: 2: hiba: A “CrossingZoneState” nem nevez meg egy típust: CrossingZoneState CheckEntrySensor (byte esp) Hiba a projektforrások összeállításakor
Nem vagyok professzionális programozó, és új vagyok C ++ – ra, általában C # vagy VB.Net formátumban írva, így nem vagyok biztos abban, hogy mit keres itt a fordító, mind az összes, mind az egyiket deklaráljuk egy típussal. A VS kódszerkesztő pedig n o hibák, a fent bemutatott hibák megjelennek a hibaablakban, amikor megpróbálom felépíteni.
Megjegyzések
- mindez az .ino fájlban található? előfordulhat, hogy a vázlat-előfeldolgozó átrendezi a deklarációkat és elfojtja a dolgokat.
- A Visual Studio Professional 2015-öt és az Arduino Visual Micro bővítményét használom, nem az Arduino IDE
- és igen , az összes kód az .ino fájlból származik.
- Az IDE automatikusan a metódusok deklarációit terjeszti elő a fájl tetején, kényelmesen, mielőtt az Ön által megadott típusok definiálódnának. Lehet, hogy a VS-bővítmény is megteszi, így minden ugyanaz lesz. Ha a kódot külön .h fájlba helyezi át, és a fájl tartalmazza, akkor megakadályozhatja a dolgok átrendezését, ha ez lenne a probléma.
Válasz
A megoldás az enum deklarációk áthelyezése volt egy fejlécfájlba, mivel ez egy virtuális gép kiegészítő probléma volt, amely megoldódik, amint az arduino 1.6.8 verzióját megvalósították.
Ha hozzáadja ezt a kódot egy fejlécfájlhoz, és eltávolítja a fő fájlból, a probléma megoldódott, a kód összeépült és fut.
// 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
Válasz
Egyrészt a változó állapotát definiálás nélkül használja. Ezenkívül még nem deklarálta a CheckEntrySensor () és a dobRelayAndCheckStatus () függvényeket. függvény, anélkül, hogy először deklarálná, az arduino előfeldolgozó elkészíti a saját deklarációit, de gyakran hibásan teszi ezt. Ez az arduino környezet és a sima C ++ fordító egyik sajátossága.
A következő fordítás 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; }
Vagy ha el akarja kerülni a typedef használatát, használhatja a következőket:
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; }
Megjegyzések
- Jó, hogy sikerül megszerezned a kódot a fordításhoz, de úgy tűnik, hogy ez egy Q & Egy webhely és néhány hónap / év múlva más tapasztalatlanok lustákká válnak (Ctrl + c Ctrl + v), és nem szerzek semmilyen megértést a problémák okáról vagy megoldásáról. Bemutatná, hogy miért miért állította össze, és esetleg megemlíti a
enums
ilyen módon történő általános használatát. - A def típus egy C felépítésű, és nem szabványos a C ++ 11 és a továbbiakban, és a továbbiakban nem ajánlott az enums-hez.
- Nagyon sok kódfordítás nem ‘ t tedd helyessé vagy eredményessé
- @RSM: Igazad van.
- a) A CheckEntrySensor () függvényben a változó állapotát definiálás nélkül használták.