2016-04-18 7 views
0

このコードは、Visual Microのアドインfor Arduinoを使用してVS2015で開発され、arduinoプログラムの一部です。これはArduino stackexchangeサイトにも最小限のレスポンスで投稿されました。C++の関数でenumを使用

を考えると、次の列挙型

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を列挙型クラスにすることも試みましたが、同様の型エラーが発生しました。上記のコードでVS2015からのエラーがあります。

Compiling debug version of 'ModelRRXingStateMachine' for 'Arduino/Genuino Uno' ModelRRXingStateMachine.ino:11:55: error: 'RelayState' has not been declared :boolean throwRelayAndCheckStatus(uint8_t relayNumber, RelayState relayState) ModelRRXingStateMachine.ino:2:1: error: 'CrossingZoneState' does not name a type :CrossingZoneState CheckEntrySensor(byte esp) Error compiling project sources

(ModelRRXingStateMachineは、ファイルの名前です)私は通常ので、私は、コンパイラはここで探しているものはわからないんだけど、C#またはVB.Netへの書き込み、プロのプログラマーではないんだとC++に新しいです両方の列挙型が宣言され、1つが型付きで宣言されます。また、VSコードエディタにエラーが表示されていないため、ビルドしようとすると、上記のエラーがエラーウィンドウに表示されます。

+0

が、それは 'RelayState'は' throwRelayAndCheckStatus'がコンパイルされた時点で宣言されていない、と似たような状況は、おそらくであることを言えば十分'CrossingZoneState'と' CheckEntrySensor'に対して真です。特に 'relayState'を' digitalWrite'が予期しているものにキャストしていないので、それ以上の問題があるかもしれません。 – MBraedley

+0

両方のenumがすべてのinclude文の後に宣言されていますが、関数の前にコンパイルされていない可能性はありますか?必要に応じて、プログラム全体がかなり長い間それを投稿します。 digitalWriteはHIGHまたはLOWをとり、それが渡されます。 – dinotom

+0

同じ名前空間の同じ.cppファイルで宣言されていますか?それらはそれらを使用する機能の前に宣言されていますか? –

答えて

0

解決策は、もちろん、問題コードをヘッダーファイルに移動することでした。そこで、このコードを新しいヘッダーファイルに移動し、それをメインプログラムに含めてビルドしました。それは問題がある、まさに言うことは難しい完全なプロジェクトなし

// 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 
関連する問題