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

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

Метки:
  1. mcureenab

    mcureenab Гуру

    Все это остается на усмотрение компилятора. Маленькие объекты могут храниться в регистрах или подставляться непосредственно в команды МК без обращения к памяти по адресу.
    Чтобы обеспечить указанное вами поведение, когда значение всегда читается по адресу переменной, есть модификатор volatile.
     
  2. Igor68

    Igor68 Гуру

    Перевожу на разговорный:
    Код (C++):
    #define C 8; //точка с запятой в строке #define запрещена - это не переменная а значению C присваивается 8
    const int c = 8; //переменная - глобальная и доступная всем функциям
    void f(const int * a); //обращение к указателю переменной... к адресу, где она находится

    ...
    f(&c); // Ok! - понятное дело эта переменная существует
    f(&C); // Ошибка - так и должно быть, ведь переменной такой нет
     
     
    Последнее редактирование: 2 янв 2017
  3. ИгорьК

    ИгорьК Гуру

    Многие знания порождают пичальку...
    Еще и volatile сюда...
     
  4. Igor68

    Igor68 Гуру

    Никаких усмотрений компилятора!!! #define он и в африке #define
     
  5. ИгорьК

    ИгорьК Гуру

    ... это когда спецы по Сям от Intel приходят к AVR. Вижу, меня даже не слышат и проблема не воспринимается...
     
    Последнее редактирование: 2 янв 2017
  6. Igor68

    Igor68 Гуру

    Простите, если что не так сказал! Новый год всё таки!
     
    Последнее редактирование: 2 янв 2017
  7. ИгорьК

    ИгорьК Гуру

    Это как раз подтверждение всего сказанного Вами, просто не ту цитату схватил и выразился неудачно. Извините.

    Поясню всем проблему ещё раз.
    У вас есть некоторая программа, которая работает с десятком разных, заранее определённых, отрезков времени. От 4 до 20 единиц: не важно, главное это до 8 бит.
    Время в авр - unsined long.
    Вы будете заводить десяток const 32-битных переменных или дефайнить? И как оба варианта будут расходовать память?
    И добавьте сюда определение десятка ног МК. Так проблема вырисовывается лучше?

    В общем, слегка удивляет этот int, пусть и const там, где число до 8 бит и переменная вовсе не требуется.
    Отсылка к мудрости компилятора при этом не убеждает: при дефайне он точно не заведет переменную, при const int - зона неопределённости. Стоит ли при этом рассуждать об отличиях Си от С++? Не уверен.
     
    Последнее редактирование: 2 янв 2017
  8. Igor68

    Igor68 Гуру

    Если есть возможность и вы не выбираете значение по какому-то номеру из массива, то #define выгоднее (тут переменные не требуются):
    Код (C++):
    #define pin1 10
    #define pin2 7
    #define pin3 2
    .....
    //функция для установки пинов
    void setPin(int pin)
    {
        ........
    }
    .....
    //выбор пина по номеру
    void func1(int num)
    {
        switch(num)
        {
           case 1: //pin1
                 setPin(pin1);
                 break;
           case 2: //pin2
                 setPin(pin2);
                 break;
           default: //в любых других случаях pin3
                 setPin(pin3);
                 break;
        }
    }
    ......
    //вызываем
    func1(5);
    ......
     
    Но если требуется то можно и выбирать из списка или массива переменных. Но в этом случае потребуется ещё время на извлечение параметра. Тогда мы тратим и время и память. Только не могу никак понять причём тут отличие C++ от C. Вы же не собираетесь для этого применять классы. Хотя может кому-то и надо... ну допустим для самотренировки.
     
    Последнее редактирование: 2 янв 2017
  9. та какая разница?, этж ардуина.
    и вообще нужно сразу в регистры писать, без новомодных функций.
     
  10. Igor68

    Igor68 Гуру

    Это абстракция - пишите сразу в регистры!:)
     
  11. нетуж, тогда все будут говорить что я программист.

    аа, я не про код выше.
    про всю тему.
     
  12. rkit

    rkit Гуру

    Такого рода микрооптимизации будут выглядеть довольно неуместно рядом с digitalWrite. длящейся больше 25 циклов. И грузить этим новичка, не умеющего программировать, тоже не стоит.
     
  13. Igor68

    Igor68 Гуру

    Простите Если Можете! Думал точку с запятой в самом начале уже убрали... а это не нужное, впрочем уже точно к теме отношения не имеет... сам часто наблюдал подобное.
    Ещё раз прошу прощения!
     
  14. mcureenab

    mcureenab Гуру

  15. mcureenab

    mcureenab Гуру

    Я ошибся в коде, вы в комментарии. Итого две ошибки в одном #define. И кто мне еще будет говорить, что ошибки и #define ортогональны??? )))

    То что переменной нет, так оно бесспорно. Плохо то, что один идентификатор поддерживает взятие указателя, а другой с подобной семантикой - нет. Реальная ошибка на ровном месте ради мифической экономии.
     
  16. qwone

    qwone Гик

    Вот читаю вас и понимаю , что байка про Аристотеля и мухи в 8 ног, реальность. Ведь проще всего поймать муху и посчитать ноги. Но нет. Если Аристотель написал, что 8 ног, то так и есть. Найдите Ардуину и проверьте. Программирование это практика , а не теология, в результаты скетча не надо верить, надо тестировать.
    я пишу без static . static константе бессмысленен.
     
  17. ИгорьК

    ИгорьК Гуру

    Плохо читаете. Очень плохо. Я уже написал, что нет у меня компа и ардуино и в ближайшее время не предвидится.
    Но общие черты программы, которую проверю обязательно, я накидал. Проверю и отпишусь здесь через две недели. А пока - с Новым Годом :)
    20170101_000532.jpg
     
    Последнее редактирование: 2 янв 2017
  18. qwone

    qwone Гик

    Применять #define надо в таком коде.
    Код (C++):
    /*
      Включаем, включается реле, мотор вкл и делает 1 мах и доходит до концевика и выключается. Ждем несколько сек, которые задаются переменником, и снова вкл реле и мотор поехал на следующий мах.
      Пауза от 2 до 10 сек
    */


    #define MOTOR_SWITCH  2                 //выключатель дворников - на землю
    #define MOTOR_SENSOR  3                 //геркон - на землю
    #define MOTOR         13                 //включается высоким уровнем
    #define SPEED         A0                //средний переменника (края на +5 и землю)

    #define PAUSE_MIN     2000              //минимальная пауза, мс
    #define PAUSE_MAX     30000             //максимальная
    #define PARK_OUT      900               //время выхода магнита из зоны срабатывания геркона

                                                   //макросы для наглядности:
    #define IN(x)         pinMode(x, INPUT_PULLUP) //на ввод
    #define OUT(x)        pinMode(x, OUTPUT)       //на вывод
    #define ON(x)         digitalWrite(x, HIGH)    //включить
    #define OFF(x)        digitalWrite(x, LOW)     //выключить
    #define PIN(x)        !digitalRead(x)          //читать датчик
    #define AIN(x)        analogRead(x)            //читать аналог


    void setup()
    {
      OFF(MOTOR);                           //в начальном состоянии мотор выключен
      OUT(MOTOR);
      IN(MOTOR_SWITCH);                     //переключатель и геркон подтянуты резистором
      IN(MOTOR_SENSOR);
    }


    void loop()
    {
      if (PIN(MOTOR_SWITCH)) {              //переключатель включен:
        ON(MOTOR);                          //включаем дворники
        delay(PARK_OUT);                    //ждём выхода магнита из зоны геркона
        while(!PIN(MOTOR_SENSOR));          //теперь ждём срабатывания геркона
        OFF(MOTOR);                         //выключаем дворники
        delay(PAUSE_MIN + ((PAUSE_MAX - PAUSE_MIN) / 256) * (AIN(SPEED)>>2)); //пауза
      }
    }
    А вот в обычном Ардуине скетче это делать не надо. А то будет правая нога на лыже, а левая на коньках.
     
  19. ИгорьК

    ИгорьК Гуру

    Вопрос "почему" задавать уже не буду, а слепая вера в изречнния давно прошла.
     
  20. mcureenab

    mcureenab Гуру

    Так определенно делать не надо. В C++ есть inline функции.