함수에서 열거 형 사용

다음 열거 형이 주어짐

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

여기서 RELAY_OFF = HIGH, HIGH는 #define HIGH 0x1이며 C ++ / Arduino 상수라고 가정합니까? 정의하지 않았기 때문입니다. RELAY_ON = LOW, LOW는 0x0입니다.

다음 함수에서 다음과 같은 오류가 발생합니다.

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

RelayState를 enum 클래스로 설정하려고했지만 유사한 유형 오류가 발생했습니다. 위 코드는 VS2015에서 발생한 오류입니다.

“Arduino / Genuino Uno”에 대한 “ModelRRXingStateMachine”디버그 버전 컴파일 중 ModelRRXingStateMachine.ino : 11 : 55 : 오류 : “RelayState”가 선언되지 않았습니다. : boolean throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState) ModelRRXingStateMachine.ino : 2 : 1 : 오류 : “CrossingZoneState”는 유형의 이름을 지정하지 않습니다. : CrossingZoneState CheckEntrySensor (byte esp) 프로젝트 소스 컴파일 오류

저는 전문 프로그래머가 아니며 신규입니다. C ++로, 일반적으로 C # 또는 VB.Net으로 작성하므로 컴파일러가 여기서 무엇을 찾고 있는지 확실하지 않습니다. 두 열거 형이 선언되고 하나는 유형으로 선언됩니다. 또한 VS 코드 편집기에 n이 표시됩니다. o 오류, 위에 표시된 오류는 빌드하려고 할 때 오류 창에 표시됩니다.

댓글

  • 이 모든 것이 .ino에 있습니까? 스케치 전처리 기가 선언 순서를 변경하고 작업을 정리할 수 있습니다.
  • Arduino IDE가 아닌 Visual Studio Professional 2015 및 Arduino 용 Visual Micro 추가 기능을 사용하고 있습니다.
  • 그리고 예 ,이 모든 코드는 .ino 파일에서 가져온 것입니다.
  • IDE는 사용자가 만든 유형을 정의하기 전에 편리하게 메서드에 대한 선언을 파일 맨 위에 자동으로 배치합니다. VS 추가 기능도 그렇게 할 수 있으므로 모든 것이 동일하게 컴파일됩니다. 코드를 별도의 .h 파일로 이동하고 해당 파일을 포함하면 문제가있는 경우 항목의 순서가 변경되지 않습니다.

Answer

해결 방법은 enum 선언을 헤더 파일로 옮기는 것이 었습니다. 이는 arduino 버전 1.6.8을 구현하면 해결 될 VM 추가 기능 문제 였기 때문입니다.

이 코드를 헤더 파일에 추가하고 기본 파일에서 제거하면 문제가 해결되고 코드가 빌드되고 실행됩니다.

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

답변

한 가지는 변수 상태를 정의하지 않고 사용하고 있다는 것입니다. 또한 CheckEntrySensor () 및 throwRelayAndCheckStatus () 함수를 선언하지 않았습니다. 함수를 먼저 선언하지 않은 상태에서 arduino 전처리 기가 자체 선언을 작성하지만 종종 결함이있는 방식으로 수행합니다. 이것은 arduino 환경과 일반 C ++ 컴파일러의 특이성 중 하나입니다.

다음 컴파일 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; } 

또는 typedef를 사용하지 않으려면 다음을 사용할 수 있습니다.

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

코멘트

  • 컴파일 할 코드를 얻을 수 있다는 것은 좋지만 Q 인 것 같습니다. & 사이트와 경험이없는 다른 사이트로부터 몇 개월 / 년이 지나면 게으르고 (Ctrl + c Ctrl + v) 문제의 원인이나 해결책에 대해 이해하지 못합니다. 따라서 컴파일 된 이유 에 대해 자세히 설명해 주시고 이러한 방식으로 enums의 일반적인 사용을 언급 할 수도 있습니다.
  • Type def는 C 구조이며 C ++ 11 이상에서는 표준이 아니며 더 이상 열거 형에 권장되지 않습니다.
  • 많은 코드 컴파일이 수행되지만 ‘ t 올바른지 또는 효과적인지 확인
  • @RSM : 맞습니다.
  • a) CheckEntrySensor () 함수에서 변수 상태는 정의되지 않고 사용되었습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다