Помогите я нуб :( (пишет ошибку 'else' without a previous 'if').

Тема в разделе "Arduino & Shields", создана пользователем FiRe_0K, 1 янв 2017.

Метки:
  1. FiRe_0K

    FiRe_0K Нуб

    вот скетч:
    int switchPin = 8;
    int ledPin = 13;
    void setup() {
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
    }

    void loop()
    {
    if (digitalRead(switchPin) == HIGH);
    {
    digitalWrite(ledPin, HIGH);
    }
    else
    {
    digitalWrite(ledPin, LOW);
    }

    }
    Что не так? Скажите пожалуйста! Откорректируйте.
     
  2. rkit

    rkit Гуру

    Точка с запятой закрыла if
     
  3. FiRe_0K

    FiRe_0K Нуб

    а изменить то что надо???
    :)
     
  4. FiRe_0K

    FiRe_0K Нуб

    А что изменить то надо???
    :(
     
  5. qwone

    qwone Гик

    Код (C++):
    const int switchPin = 8;// надо const
    const int ledPin = 13;// надо const
    void setup() {
      pinMode(switchPin, INPUT);
      pinMode(ledPin, OUTPUT);
    }

    void loop() {
      if (digitalRead(switchPin) == HIGH)//; <- здесь она не нужна
      {
        digitalWrite(ledPin, HIGH);
      }
      else
      {
        digitalWrite(ledPin, LOW);
      }
    }
     
    Igor68 и FiRe_0K нравится это.
  6. FiRe_0K

    FiRe_0K Нуб

    большое спасибо!
     
  7. FiRe_0K

    FiRe_0K Нуб

    ура
     
  8. ИгорьК

    ИгорьК Гуру

    Почему не #define?
     
    Igor68 нравится это.
  9. qwone

    qwone Гик

    Я пишу в синтаксе С++, а не объектном Си.
     
  10. ИгорьК

    ИгорьК Гуру

    Кроме этой замечательной особенности есть ещё предположение о том, что const int и #define занимают разное количество памяти в 8-битном МК. Но это только предположение.
     
  11. qwone

    qwone Гик

    А я точно знаю. Что памяти ОЗУ там и там не расходуется.
     
  12. ИгорьК

    ИгорьК Гуру

    Это вера или что-то более точно описанное в документах?
     
  13. Igor68

    Igor68 Гуру

    #define не имеет к объектам никакого отношения
    фраза:
    Код (C++):
    const int switchPin = 8;
    говорит, что некоторой переменной с именем switchPin присвоено значение 8
    ИгорьК предложил применить #define, что вполне очень логично:
    Код (C++):
    #define switchPin  8
    гласит что значение switchPin соответствует 8. Одним словом при компиляции switchPin будет заменено на 8, т.е. будто вы сами в программе поставили восьмёрку вместо switchPin. Памяти не занимает никакой и никаких "лишних" действий при выполнении программы.
     
  14. mcureenab

    mcureenab Гуру

    Порождаемый код зависит от реализации компилятора и от цели оптимизатора. Стандартом не регламентируется.

    Что определенно не следует делать, так это использовать #define там где можно использовать const.
    Неаккуратное определение и использование макроподстановки может создавать трудноуловимые ошибки.
     
  15. ИгорьК

    ИгорьК Гуру

    Это тоже из области веры?
    Возможность ошибок - это другой раздел дискуссии.
     
  16. Igor68

    Igor68 Гуру

    Ну вы сами подумайте к const вам каждый раз надо обращаться к ячейки памяти... то есть сначала читать значение из неё, а только потом выполнять действие с этим. А если это фиксированное определение - то лишних обращений не требуется... а для определений для указанных пинов это вообще бессмысленно.
    Код (C++):
    int switchPin = 8;
    int ledPin = 13;
    тут для определения выводов целых две ячейки, которые потом сначала надо читать, а потом применять. Выгодно если эти параметры потом будут изменяться.
    Код (C++):
    #define switchPin 8
    #define ledPin 13
    фиксированные значения... не применяются либо мазахистами, либо начинающими... ну либо теми, кто скопировал в процессе обучения.
     
    Последнее редактирование: 2 янв 2017
  17. mcureenab

    mcureenab Гуру

    Нет. Это рекомендация разработчика C++.
    Как один из примеров неуместного использования макроса:
    Код (C++):
    #define C 8;
    const int c = 8;
    void f(const int * a);

    ...
    f(&c); // Ok!
    f(&C); // Ошибка
     
  18. ИгорьК

    ИгорьК Гуру

    Вообще то решение поднятых здесь вопросов лежит не в плоскости рассуждений о соотношении С и С++ как языков программирования, а в исследовании поведения конкретного компилятора http://www.nongnu.org/avr-libc/user-manual/modules.html
    И удержания в памяти того, что ардуино - 8 битный процессор.
    Был бы у меня комп и ардуина под рукой, я был бы более определенен.
     
  19. Igor68

    Igor68 Гуру

    Тут божий дар и яичницу принимают за одно и тоже
     
  20. ИгорьК

    ИгорьК Гуру

    Почитайте этот форум и Вы увидите массу примеров удивительных использований не только макросов, но и всех знаков алфавита и конструкций языка.
    Вопрос вот в чем: надо ли заводить двухбайтную переменную для определения ноги мк или ограничиться подстановкой с целью экономии памяти.
    Руководства по Сям разных видов ответа на вопрос не дают, логика предполагает что подстановка экономнее а практика - критерий истины.