2013-07-22 2 views
0

У меня возникли проблемы с использованием пользовательского типа перечислений в Arduino.Пользовательское объявление типа перечисления с Arduino

Я читал elsewhere, что использование файла заголовка необходимо для пользовательских объявлений типа, из-за предварительной обработки Arduino IDE. Итак, я сделал это, но я все еще не могу использовать свой собственный тип. Вот соответствующие части моего кода в моей основной файл Arduino (beacon.ino)

#include <beacon.h> 

State state; 

И в beacon.h:

typedef enum { 
    menu, 
    output_on, 
    val_edit 
} State; 

Но, когда я пытаюсь скомпилировать, я получаю следующее сообщение об ошибке :

beacon:20: error: 'State' does not name a type 

Я предполагаю, что что-то не так, как я написал или включил мой заголовочный файл. Но что?

+0

Как насчет 'typedef?' – imreal

+0

У вас есть ошибка типа 'typdef enum {' должно быть 'typedef enum {' (отсутствует 'e' в typ'e'def) –

+0

Просто интересно, почему не было другого компилятора ошибка? – Jiminion

ответ

2

beacon.h должно быть следующим:

/* filename: .\Arduino\libraries\beacon\beacon.h */ 

typedef enum State{ // <-- the use of typedef is optional 
    menu, 
    output_on, 
    val_edit 
}; 

с

/* filename: .\Arduino\beacon\beacon.ino */ 
#include <beacon.h> 
State state; // <-- the actual instance 
void setup() 
{ 
    state = menu; 
} 

void loop() 
{ 
    state = val_edit; 
} 

оставить вне typdef и либо концевая экземпляр "состояние" выключено, как вы Instancing его в основной файл INO или наоборот. Если указанный файл beacon.h должен находиться в каталоге users. \ Arduino \ libraries \ beacon \ directory, а IDE необходимо перезапустить, чтобы кэшировать его местоположение.

Но вы могли бы просто определить его и экземпляр все это сразу в ИНО

/* filename: .\Arduino\beacon\beacon.ino */ 

enum State{ 
    menu, 
    output_on, 
    val_edit 
} state; // <-- the actual instance, so can't be a typedef 

void setup() 
{ 
    state = menu; 
} 

void loop() 
{ 
    state = val_edit; 
} 

И компилироваться.

Вы также можете использовать следующие:

/* filename: .\Arduino\beacon\beacon2.ino */ 

typedef enum State{ // <-- the use of typedef is optional. 
    menu, 
    output_on, 
    val_edit 
}; 

State state; // <-- the actual instance 

void setup() 
{ 
    state = menu; 
} 

void loop() 
{ 
    state = val_edit; 
} 

здесь экземпляр отдельно от перечисления, позволяя перечисление быть исключительно ЬурейеЕ. Где выше это экземпляр, а не typedef.

+0

Эй, спасибо за ваш ответ. Тем не менее, есть некоторые вопросы. 1) Когда я пытаюсь включить все в файл INO, как вы это делали (фактически, используя свой код), я получаю следующую ошибку: ошибка: ожидаемый неквалифицированный-идентификатор перед токеном '=' Во-вторых, я был под впечатление, что перечисление x {blah, blah} просто объявило перечислимую переменную и завернуло ее в typedef [...] y; просто дал сокращенный способ ссылаться на него с необходимостью перечислять переменную x везде. Но вы говорите, что typedef enum x {blah, blah} y; на самом деле его внушает? –

+0

мой плохой я оставил в typedef на втором примере. – mpflaga

+0

Из перечисления x {blah, blah} y; y является экземпляром. Итак, более поздний x = y; будет вторым экземпляром. – mpflaga

Смежные вопросы