Что такое «Continue statement not within a loop»…?

prosto_andriy
Offline
Зарегистрирован: 09.12.2012

Написал (точнее немного изменил) простейший пример скетча для управления яркостью светодиода. По идее он должен медленно увеличивать яркость, а затем при достижении максимума сразу гасить светодиод.
Примерно так:

Вот код скетча:

int led = 9;           // вывод для подключения светодиода
int brightness = 0;    // начальная яркость
int fadeAmount = 5;    // шаг измениния яркости


void setup()  { 
  
  pinMode(led, OUTPUT); // настраиваем на выход
} 

// бесконечный цикл
void loop()  { 
  // яркость на выходе led бедет равна...
  analogWrite(led, brightness);    

  // пошагово изменяем яркость в цикле...
  brightness = brightness + fadeAmount;

  // когда яркость повысится до 200, 
  // cбрасываем напряжение со светодиода 
  if (brightness == 200) {fadeAmount = -200;}
  else continue;  
  // пауза 30 мс  
  delay(30);                            
}

Но в итоге, почему-то программа выдает ««Continue statement not within a loop»…?

Помогите пожалуйста? Что я написал неправильно? Что нужно изменить?
 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Раз уж не понимаете зачем эта строка, то выкинбте ее просто из скетча. Но работать все равно будет неправильно )))

prosto_andriy
Offline
Зарегистрирован: 09.12.2012

JollyBiber пишет:

Раз уж не понимаете зачем эта строка, то выкинбте ее просто из скетча. Но работать все равно будет неправильно )))

Почему неправильно? Буквально, если перевести эти две строки

  if (brightness == 200) {fadeAmount = -200;}
22	  else continue;  

с языка Arduino на нормальный, то получится:

ЕСЛИ яркость увеличиться до значения 200, ТОГДА уменьшить её значение на 200.

ИНАЧЕ ПРОДОЛЖИТЬ

Разве это не соответствует алгоритму, приведенном на графике  в начале темы? В чем тогда ошибка???

 

vadim.tusur
Offline
Зарегистрирован: 04.01.2014

Попробуйте написать так:

if (brightness >= 200) {brightness =0;}

а else убрать.

step962
Offline
Зарегистрирован: 23.05.2011

оператор continue используется внутри циклов do/for/while. А "цикл" по-английски "loop".

А "loop", который "void ..." - это вовсе не цикл, а очень даже функция.

На что вам компилятор мягко намекаЭ...

com
Offline
Зарегистрирован: 06.09.2013

prosto_andriy пишет:

Почему неправильно? Буквально, если перевести эти две строки

  if (brightness == 200) {fadeAmount = -200;}
22	  else continue;  

с языка Arduino на нормальный, то получится:

ЕСЛИ яркость увеличиться до значения 200, ТОГДА уменьшить её значение на 200.

ИНАЧЕ ПРОДОЛЖИТЬ

 

да, это с ардуинского на русский, но в гоблинском переводе :)

fadeamount - не яркость, а шаг изменения яркости

vadim.tusur
Offline
Зарегистрирован: 04.01.2014

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

Клапауций
Offline
Зарегистрирован: 10.02.2013

vadim.tusur пишет:

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

запретить отбивать охоту заниматься!

com
Offline
Зарегистрирован: 06.09.2013

vadim.tusur пишет:

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

да никто не стебется, это ободряющее дружеское похлопывание по плечу :)

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

vadim.tusur пишет:

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

Тут все просто. Либо начинаешь с азов, либо лепишь "красивый" код и веселишь народ. Бумажку с ручкой + ручной прогон алгоритма еще никто не отменял.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

prosto_andriy пишет:

JollyBiber пишет:

Раз уж не понимаете зачем эта строка, то выкинбте ее просто из скетча. Но работать все равно будет неправильно )))

Почему неправильно? Буквально, если перевести эти две строки

  if (brightness == 200) {fadeAmount = -200;}
22	  else continue;  

с языка Arduino на нормальный, то получится:

ЕСЛИ яркость увеличиться до значения 200, ТОГДА уменьшить её значение на 200.

ИНАЧЕ ПРОДОЛЖИТЬ

Разве это не соответствует алгоритму, приведенном на графике  в начале темы? В чем тогда ошибка???

Не соответствует. В Вашем скетче написано

ЕСЛИ яркость увеличиться до значения 200, ТОГДА изменить шаг увеличения яркости за проход на -200.

И уже через максимум 2 прохода у нас яркость становится -200 и продожает уменьшатся. Все! Поздравляю! Вы создали черную дыру и нашей галактики приходит веселый пушной зверек!

Клапауций
Offline
Зарегистрирован: 10.02.2013

JollyBiber пишет:

Не соответствует. В Вашем скетче написано

ЕСЛИ яркость увеличиться до значения 200, ТОГДА изменить шаг увеличения яркости за проход на -200.

И уже через максимум 2 прохода у нас яркость становится -200 и продожает уменьшатся. Все! Поздравляю! Вы создали черную дыру и нашей галактики приходит веселый пушной зверек!

мне кажется, что чёрная дыра должна иметь категрически нулевую яркость - отрицательную яркость будет иметь источник антивещества, низвергающийся в нашу вселенную.

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Клапауций пишет:

мне кажется, что чёрная дыра должна иметь категрически нулевую яркость - отрицательную яркость будет иметь источник антивещества, низвергающийся в нашу вселенную.

Антивещество просто аннигилирует, черная дыра в свою очередь имеет настолько отрицательное давление после коллапса супер-гиганта, что засасывает все включая световые волны. В общем брутальная смесь пылесоса и Саши Грэй.

ites
Offline
Зарегистрирован: 26.12.2013

prosto_andriy пишет:

Написал (точнее немного изменил) простейший пример скетча для управления яркостью светодиода. По идее он должен медленно увеличивать яркость, а затем при достижении максимума сразу гасить светодиод.
Примерно так:


График красивый. Без него я бы не понял суть и ничем бы не помог :)

prosto_andriy пишет:
Вот код скетча:

int led = 9;           // вывод для подключения светодиода
int brightness = 0;    // начальная яркость
int fadeAmount = 5;    // шаг измениния яркости


void setup()  { 
  
  pinMode(led, OUTPUT); // настраиваем на выход
} 

// бесконечный цикл
void loop()  { 
  // яркость на выходе led бедет равна...
  analogWrite(led, brightness);    

  // пошагово изменяем яркость в цикле...
  brightness = brightness + fadeAmount;

  // когда яркость повысится до 200, 
  // cбрасываем напряжение со светодиода 
  if (brightness >= 200) 
     brightness = 0;
  // пауза 30 мс  
  delay(30);                            
}

Помогите пожалуйста? Что я написал неправильно? Что нужно изменить?

Запусти исправленный код. Но, вообще, начинать надо с азов программирования, с какой-либо книжки по С++.

ites
Offline
Зарегистрирован: 26.12.2013

Клапауций пишет:

мне кажется, что чёрная дыра должна иметь категрически нулевую яркость - отрицательную яркость будет иметь источник антивещества, низвергающийся в нашу вселенную.

Это так должно казаться наблюдателю снаружи. Внутри она очень яркая, просто свет не может вырваться за её пределы.

prosto_andriy
Offline
Зарегистрирован: 09.12.2012

ites пишет:

prosto_andriy пишет:

Написал (точнее немного изменил) простейший пример скетча для управления яркостью светодиода. По идее он должен медленно увеличивать яркость, а затем при достижении максимума сразу гасить светодиод.
Примерно так:


График красивый. Без него я бы не понял суть и ничем бы не помог :)

prosto_andriy пишет:
Вот код скетча:

int led = 9;           // вывод для подключения светодиода
int brightness = 0;    // начальная яркость
int fadeAmount = 5;    // шаг измениния яркости


void setup()  { 
  
  pinMode(led, OUTPUT); // настраиваем на выход
} 

// бесконечный цикл
void loop()  { 
  // яркость на выходе led будет равна...
  analogWrite(led, brightness);    

  // пошагово изменяем яркость в цикле...
  brightness = brightness + fadeAmount;

  // когда яркость повысится до 200, 
  // cбрасываем напряжение со светодиода 
  if (brightness >= 200) 
     brightness = 0;
  // пауза 30 мс  
  delay(30);                            
}

Помогите пожалуйста? Что я написал неправильно? Что нужно изменить?

Запусти исправленный код. Но, вообще, начинать надо с азов программирования, с какой-либо книжки по С++.

Ваш код работает правильно! Большое СПАСИБО за подсказку! Но теперь у меня появился ещё вопрос, как добавить паузу после того, как светодиод погаснет! То есть, чтобы он не сразу начинал увеличивать яркость, а например через 1-2 секунды! Я попробовал дописать в код "delay(1000);" Вот так:

int led = 9;           // вывод для подключения светодиода
int brightness = 0;    // начальная яркость
int fadeAmount = 5;    // шаг измениния яркости


void setup()  { 
  
  pinMode(led, OUTPUT); // настраиваем на выход
} 

// бесконечный цикл
void loop()  { 
  // яркость на выходе led бедет равна...
  analogWrite(led, brightness);    

  // пошагово изменяем яркость в цикле...
  brightness = brightness + fadeAmount;

  // когда яркость повысится до 200, 
  // cбрасываем напряжение со светодиода 
  if (brightness >= 200) {brightness = 0; delay(1000);}
  // пауза 30 мс  
  delay(30);                            
}

Но почему-то код не работает, так как я думал! По идее ведь после того, как яркость достигнет 200, она должна стать нулевой и затем

delay(1000); //пауза 1 секунда

Но работает почему-то не так??? Подскажите ПОЖАЛУЙСТА почему? В чём здесь ошибка???

vadim.tusur
Offline
Зарегистрирован: 04.01.2014

Вы обнулили яркость, но это только переменная! Вначале новое значение нужно отправить в порт!

То есть сделать так:

if (brightness >= 200) {brightness = 0; analogWrite(led, brightness); delay(1000);}

Иначе, как светодиод узнает, что его обнулили?

prosto_andriy
Offline
Зарегистрирован: 09.12.2012

Да! Вы правы! Об этом я к сожалению не подумал. Большое спасибо Вам за подсказку!

prosto_andriy
Offline
Зарегистрирован: 09.12.2012

C помощью цикла FOR легко задать увеличение/уменьшение яркости по отдельности, а вот интересно можно ли обойтись без него, чтобы изменять яркость так:

Это возможно без цикла FOR ?

ites
Offline
Зарегистрирован: 26.12.2013

prosto_andriy пишет:

C помощью цикла FOR легко задать увеличение/уменьшение яркости по отдельности, а вот интересно можно ли обойтись без него, чтобы изменять яркость так:

Это возможно без цикла FOR ?

Так или иначе циклическая конструкция будет присутствовать. Та же функция loop() вызывается внутри цикла -- только ты из неё вышел, как сразу она начала исполняться сначала. Процессор должен постоянно исполнять какие то инструкции, поскольку память конечна, то они исполняются по циклу :)

prosto_andriy
Offline
Зарегистрирован: 09.12.2012

ites пишет:

... Но, вообще, начинать надо с азов программирования, с какой-либо книжки по С++.

Я новичок и в программировании ни бум бум... Посоветуйте ПОЖАЛУЙСТА, с какой книжки по C++ начать? Желательно, чтобы в ней всё было описано просто и понятно - без трехэтажных формул и заумных выражений!

И ещё важный вопрос! Программирование микроконтроллеров лучше начинать с C++ или с ассемблера? Как думаете, что проще ? И что перспективнее?

Сколько времени нужно потратить, чтобы научиться писать программы (имею ввиду не мигание светодиодами ), а те что выполняют реально полезные функции?