WTF? Простейший код и срыв стека.

Тема в разделе "Флудилка", создана пользователем acos, 25 фев 2014.

  1. acos

    acos Официальный гик Администратор

    или не срыв стека? Короче WTF)
    Два светодиода на 10,11. Вот так всё ок:

    Код (Text):

    void setup() {
      // put your setup code here, to run once:

      pinMode(10, OUTPUT);
      pinMode(11, OUTPUT);


    }

    void loop() {
      // put your main code here, to run repeatedly:

      for (byte i=0; i<255; ++i)
      {
        analogWrite(10, i);
        analogWrite(11, 255-i);  
        delay(10);
      }

        for (byte i=255; i>0; --i)
      {
        analogWrite(10, i);
        analogWrite(11, 255-i);  
        delay(10);
      }

    }
    А вот так всё не ок. Добавили во втором цикле сравнение с нулём. В первый проход работают оба цикла, но после второго цикла идёт снова второй.
    и снова второй.
    и снова второй.
    и снова второй. Первого больше не будет никогда)
    WTF?

    Код (Text):
    void setup() {
      // put your setup code here, to run once:

      pinMode(10, OUTPUT);
      pinMode(11, OUTPUT);


    }

    void loop() {
      // put your main code here, to run repeatedly:

      for (byte i=0; i<255; ++i)
      {
        analogWrite(10, i);
        analogWrite(11, 255-i);  
        delay(10);
      }

        for (byte i=255; i>=0; --i)
      {
        analogWrite(10, i);
        analogWrite(11, 255-i);  
        delay(10);
      }

    }
    Ну и если добавить меньше или равно в первом цикле, то будет только первый цикл
    Код (Text):
    void setup() {
      // put your setup code here, to run once:

      pinMode(10, OUTPUT);
      pinMode(11, OUTPUT);


    }

    void loop() {
      // put your main code here, to run repeatedly:

      for (byte i=0; i<=255; ++i)
      {
        analogWrite(10, i);
        analogWrite(11, 255-i);  
        delay(10);
      }

        for (byte i=255; i>0; --i)
      {
        analogWrite(10, i);
        analogWrite(11, 255-i);  
        delay(10);
      }

    }
    Ну и естественно если заменить byte на int то всё шикарно. Короче где-то что-то пошло не так) И не очень понятно почему.

    Открыл .hex в дизассемблере.... Попрактиковал "Метод пристального взгляда"... Закрыл дизассемблер)
     
  2. acos

    acos Официальный гик Администратор

    Всё, апокалипсис отменяется)
    А теперь внимание, решение!
    Фаза 1:
    Код (Text):

    for (byte i=255; i>=0; --i) // допустим сейчас у нас i = 1. Отлично! Выполняем цикл!
      {
        analogWrite(10, i);
        analogWrite(11, 255-i);
        delay(10);
      } //А вот тут у нас выполняется --i, и теперь i=0
     
    Фаза 2:
    Код (Text):

    for (byte i=255; i>=0; --i) // Теперь у нас i=0. Условие выполняется? — ДА.
    // Отлично! Выполняем цикл!
      {
        analogWrite(10, i);
        analogWrite(11, 255-i);
        delay(10);
      } //А вот тут у нас выполняется --i, и теперь у нас (БАРАБАННАЯ ДРОБЬ) i=255!
     
    Фаза 3:
    Код (Text):

    for (byte i=255; i>=0; --i) //сейчас у нас i = 255. Отлично! Выполняем цикл!
      {
        analogWrite(10, i);
        analogWrite(11, 255-i);
        delay(10);
      } //И так до бесконечности)
     
    Задачка для проверки себя. Почему 0-1=255?
    :)
     
    Последнее редактирование: 25 фев 2014
  3. NR55RU

    NR55RU Гик

    0000 0000 - 0000 0001 = 1111 1111
    byte согласно описанию типов данных на arduino.cc является без знаковым числом от 0 до 255.
    Таким образом -1 он никогда интерпретироваться не станет :)
     
    acos нравится это.
  4. acos

    acos Официальный гик Администратор

    ответ ПРРРРРРРАВИЛЬНЫЫЙ!!!
    :)
    [​IMG]
     
  5. acos

    acos Официальный гик Администратор

    Я согласен, это был очень глупый затуп)