Прерывания

cerceli
Offline
Зарегистрирован: 19.08.2016

Здравствуйте. Пришлось столкнуться с прерываниями и  сразу встал в ступор при компиляции проекта.Не могли бы вы мне помочь? загрузил этот скетч http://arduino.ru/Reference/AttachInterrupt и он не работает, ругается на функцию прерывания, в чем может быть дело?

Arduino: 1.6.11 Hourly Build 2016/08/12 05:34 (Windows 7), Плата:"Arduino/Genuino Uno"
 
C:\Users\Роман\Documents\Arduino\sketch_aug19b\sketch_aug19b.ino: In function 'void setup()':
 
sketch_aug19b:7: error: 'blink' was not declared in this scope
 
exit status 1
'blink' was not declared in this scope
 
toc
Offline
Зарегистрирован: 09.02.2013

cerceli, попробуйте переместить функцию setup вниз под функцию blink.

Alexander, в какой-то книжке видел призыв "always compile your examples".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В старых IDE это работало, т.к. они автоматом вставляли объявление функций в начало текста.

Рад слышать, что в новых версиях они от этого дебилизма отказались.

Что делать, Вам уже сказали.

cerceli
Offline
Зарегистрирован: 19.08.2016

Спасибо,помогло)

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

ЕвгенийП пишет:

В старых IDE это работало, т.к. они автоматом вставляли объявление функций в начало текста.

Рад слышать, что в новых версиях они от этого дебилизма отказались.

Что делать, Вам уже сказали.

Я не силен в структуре языка и правилах оперледения места функций и прочего, а почему это дебилизм?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, вот смотрите. По правилам языка любая вещь должна быть объявлена прежде, чем используется. Вот, допустим я строю такую структуру пограммы.

class MyClass {
   ...
};

void f(MyClass *p)  {
   ...
}

void setup (void) {
   ...
}

void loop (void) {
   ...
}

С точки зрения языка всё правильно и любой компилятор это отлично скомпилирует.

Но разработчики ранних версий IDE считали своих пользователей дебилами, неспособными расположить функции в правильном порядке и поэтому для "облегчения жизни пользователям", перед тем, как передавать текст компилятору сами собирали все заголовки функций и помещали их в начало файла как "предопределения". В итоге IDE перед тем, как передать мой текст компилятору делала из него следующее

#include <arduino.h>
void f(MyClass *p) ;
void setup (void);
void loop (void);


class MyClass {
   ...
};

void f(MyClass *p)  {
   ...
}

void setup (void) {
   ...
}

void loop (void) {
   ...
}

Этим они добивались того, что функции можно располагать в любом порядке, т.к. они все прдварительно объявлены.

Но, этим же они сделали так, что теперь класс MyClass используется (строка 2) раньше его объявления (строка 7). Разумеется, никакой компилятор такого не пропустит.

В результате в IDE было практически невозможно использовать собственные типы данных в параметрах функций, а это уже серьёзное неудобство.

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

Т.е. своей "облегчалкой жизни для новичков" они урезали возможности языка и заодно, давая возможность располагать функции как попало, приучали новичков к стилю программирования. который никто, кроме IDE не поддерживает.

Но лично меня больше напрягало то, что получилось со своими типами - с какого бодуна они запретили мне использовать их в параметрах функций?

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

ЕвгенийП пишет:

Ну, вот смотрите. По правилам языка любая вещь должна быть объявлена прежде, чем используется. Вот, допустим я строю такую структуру пограммы.

.....

 

Спасибо, теперь все понятно, да и меня они тоже так сказать приучили к такому стилю :-)

Вы правы, они хотели сделать освоение проще для новичков. Потому как новички не будут использовать сложные конструкции в языке, а теперь платформа стала популярна, привлекла профи, и тут пришлось все менять чтобы не убирать возможности языка.