Ottaen huomioon seuraavat enumit
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 };
Missä RELAY_OFF = HIGH, HIGH on #define HIGH 0x1, jonka oletan olevan C ++ / Arduino-vakio? koska en määrittänyt sitä. Ja RELAY_ON = LOW, LOW on 0x0
Seuraavassa toiminnossa saan seuraavan virheen.
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; };
Yritin, että myös RelayState on enum-luokka, mutta sain samanlaisia virheitä. Tässä on VS2015: n virhe yllä esitetyllä koodilla.
”ModelRRXingStateMachine” -sovelluksen virheenkorjausversio mallille ”Arduino / Genuino Uno” ModelRRXingStateMachine.ino: 11: 55: virhe: ”RelayState” -ilmoitusta ei ole ilmoitettu: boolean thrownRelayAndCheckStatus (uint8_t relayNumber, RelayStateRayRateStayRateStayRateStayRateStayRateStayRateStayRateStayRateStateRayState2: Model 2 virhe: ”CrossingZoneState” ei nimeä tyyppiä: CrossingZoneState CheckEntrySensor (tavu esp) Virhe projektilähteiden kokoamisessa
En ole ammattimainen ohjelmoija ja olen uusi C ++: een, yleensä kirjoittamalla C # tai VB.Net, joten en ole varma, mitä kääntäjä etsii täältä, molemmat listat ilmoitetaan ja yksi ilmoitetaan tyypillä. Myös VS-koodieditori näyttää n o virheet, yllä esitetyt virheet näkyvät virheikkunassa, kun yritän rakentaa.
Kommentit
- onko tämä kaikki .ino-tiedostossa? luonnoksen esiprosessori saattaa järjestää uudelleen ilmoitukset ja pilata asioita.
- Käytän Visual Studio Professional 2015: tä ja Visual Micro -apuohjelmaa Arduinolle, ei Arduino IDE: tä
- ja kyllä , kaikki tämä koodi on .ino-tiedostosta.
- IDE esittää automaattisesti metodien selitykset tiedoston yläosassa, kätevästi ennen kuin kaikki tekemäsi tyypit määritetään. VS-lisäosa saattaa tehdä sen myös, joten kaikki kootaan samalla tavalla. Koodin siirtäminen erilliseen .h-tiedostoon ja kyseisen tiedoston sisällyttäminen estäisi sitä järjestämästä asioita uudelleen, jos se olisi ongelma.
Vastaa
Ratkaisuna oli siirtää enum-ilmoitukset otsikkotiedostoon johtuen siitä, että kyseessä oli virtuaalikoneen lisäosa-ongelma, joka ratkaistaan, kun he ovat toteuttaneet arduino-version 1.6.8.
Tämän koodin lisääminen otsikkotiedostoon ja poistaminen päätiedostosta ratkaisi ongelmat, ja koodi rakennettiin ja suoritettiin.
// 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
Vastaus
Ensinnäkin käytät muuttujan tilaa määrittelemättä sitä. Et myöskään ole ilmoittanut funktioita CheckEntrySensor () ja throwRelayAndCheckStatus (). Kun määrität funktio ilmoittamatta sitä ensin, arduino-esiprosessori rakentaa omat ilmoituksensa, mutta tekee sen usein viallisella tavalla. Tämä on yksi arduino-ympäristön ja tavallisen C ++ -kääntäjän idiosynkratioista.
Seuraava kääntää 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; }
Tai jos haluat välttää typedefin käyttöä, voit käyttää seuraavaa:
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; }
Kommentit
- On hyvä, että pystyt saamaan koodin käännettäväksi, mutta näyttää siltä, että tämä on Q & Sivusto ja muutaman kuukauden / vuoden kuluttua muut kokemattomat sivustot ovat laiskoja (Ctrl + c Ctrl + v) eivätkä ymmärrä ongelmien syytä tai ratkaisua. Voisitko tarkemmin selittää miksi se kokosi ja mainitsee ehkä myös
enums
-tavan yleisen käytön tällä tavalla. - Type def on C-rakenne, eikä se ole vakio C ++ 11: ssä ja eteenpäin, eikä sitä suositella enumeille enää.
- Monet koodit kääntyvät, jotka eivät ’ t tee siitä oikea tai tehokas
- @RSM: Olet oikeassa.
- a) Funktiossa CheckEntrySensor () muuttujan tilaa käytettiin määrittelemättä.