2015-07-25 2 views
1

Я работаю в моторной программе (и мне нужно управлять несколькими моторами, поэтому я использую структуру) вместе с моей arduino MEGA. я dont't понять, почему МОТОР выходит за рамки, когда я использую его в качестве аргумента в функции привода:Arduino - структура из сферы действия почему?

typedef struct motor 
{ 
    int EN; 
    /*some more ints*/ 
}MOTOR; 

MOTOR mot1; 
MOTOR mot2; /*this works with no compile error*/ 
int drive (MOTOR*) /*here i have compile error out of scope, neither with or without pointer*/ 
{ 
    return 1; 
} 

void setup() 
{} 

void loop() 
{} 


sketch_jul25a:2: error: 'MOTOR' was not declared in this scope 
sketch_jul25a:2: error: expected primary-expression before ')' token 
sketch_jul25a.ino: In function 'int drive(MOTOR*)': 
sketch_jul25a:9: error: 'int drive(MOTOR*)' redeclared as different kind of symbol 
sketch_jul25a:2: error: previous declaration of 'int drive' 
'MOTOR' was not declared in this scope 
+1

Просьба включить точное сообщение об ошибке из вашего компилятора в своем пост-формате. – shuttle87

+0

@Clemens Номера операторов сообщений об ошибках не соответствуют коду, который вы указали. Итак, покажите фактический код. –

+0

@Clemens Кажется, что проблема связана с заголовками ro ro. Возможно, у вас есть включение в виде круглых заголовков. –

ответ

5

Потому что дорога в ад проложена с добрыми намерениями.

Arduino IDE пытается помочь в создании прототипов для всех пользовательских функций в начале кода. Когда один из этих прототипов ссылается на пользовательский тип, все в порядке, описанном выше.

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

namespace 
{ 
    int drive (MOTOR*) 
    { 
    return 1; 
    } 
} 

Среда IDE работает в namespace и понятия не имеет, что делать с блоком, который следует, поэтому пропускает его.

+0

это очень помогает! – Clemens

+1

Ну, это немного жестоко, так как тот, кто использует AVR-GCC, я об этом не знал. – shuttle87

0

EDIT: Мой первоначальный ответ сделал некоторые предположения, что Arduino IDE был ближе к AVR-GCC, чем он на самом деле был. Моя общая рекомендация для любого, кто знаком с C или C++, который много работает с этими чипами, заключается в том, чтобы напрямую использовать Atmel studio и AVR-GCC, так как вы столкнетесь с меньшими проблемами.

Arduino на самом деле C++ под но это делает некоторые предварительной обработки, прежде чем она превращает ваш код в код C++, который компилируется для чипа (например, создание main от setup и loop). У вас возникла проблема из-за этапа предварительной обработки и объясняется Ignacio Vazquez-Abrams' answer.

В качестве более общей C++ использования записки я рекомендовал бы изменить свое определение структуры к этому:

struct motor 
{ 
    int EN; 
    /*some more ints*/ 
}; 

Вы можете прочитать Difference between 'struct' and 'typedef struct' in C++? понять, почему вещи немного отличаются в C++.

+1

В C++ нет необходимости указывать имя параметра в определении функции. –

+0

попробует это ... такие же ошибки. Могу ли я сделать класс для этого? – Clemens

+0

@VladfromMoscow Вы правы. В этом конкретном случае я просто задумываюсь о фактическом использовании здесь, так как не могу понять, почему функция, которая должна что-то делать, основанная на двигателе как параметре, может иметь какой-либо смысл без фактического прохождения этого параметра. Если мне что-то не хватает, я бы с удовольствием узнал. – shuttle87

1

И я предлагаю, чтобы это должно было выполнять эту работу так же хорошо, как вариант пространства имен?

struct motor 
{ 
    int EN; 
    /*some more ints*/ 
}; 
int drive (motor* mtr); 
motor mot1; 
motor mot2; /*this works with no compile error*/ 

    int drive (motor* mtr) 
    { 
    return 1; 
    } 


void setup() 
{} 

void loop() 
{ 
    int a = drive(&mot1); 
} 
Смежные вопросы