Автор Тема: Есть у нас специалисты по С++ ?  (Прочитано 1854 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Fray

  • Администратор
  • Олдфаг
  • *****
  • Сообщений: 6668
  • Рейтинг: 58
  • Пол: Мужской
    • Просмотр профиля
    • IT-Бложек
  • Откуда: Петербург
Есть у нас специалисты по С++ ?
« : 16 апреля 2021, 09:16:44 »
С++ по отношении к Ардуино.
Есть штука, где надо менять цвет по нажатию на одну кнопку, то есть перебирать цвета. Делаю примерно так:

 int color = 0;

<................>

#if IR_Key_Solid_Black
         case IR_Key_Solid_Black :           
                                  demorun = 0; ledMode = 255; palchg=0;
                                    #if color == 0
                                      solid = CRGB::Black;
                                      color++;
                                    #endif
                                    #if color == 1
                                      solid = CRGB::Red;
                                      color++;
                                    #endif
                                    #if color == 2
                                      solid = CRGB::Orange;
                                      color++;
                                    #endif
                                    #if color == 3
                                      solid = CRGB::Yellow;
                                      color++;
                                    #endif
                                    #if color == 4
                                      solid = CRGB::Green;
                                      color++;
                                    #endif
                                    #if color == 5
                                      solid = CRGB::SkyBlue;
                                      color++;
                                    #endif
                                    #if color == 6
                                      solid = CRGB::Blue;
                                      color++;
                                    #endif
                                    #if color == 7
                                      solid = CRGB::Violet;
                                      color++;
                                    #endif
                                    #if color == 8
                                      solid = CRGB::White;
                                      color = 0;
                                    #endif
                 
                 
                                     #if LOG_ON == 1
                                      Serial.println(F("Solid"));
                                      Serial.println(color);
                                    #endif
                                    break; 
                                 
        #endif

Вот этой строчкой Serial.println(color); вывожу значение на консоль - переменная меняется успешно. Но проблема заключается в том, что отрабатывает только if color == 0, если любое другое значение, то не работает. Могу поставить if color == 0 в любое место куска кода - работает.
Может я как-то неправильно сравниваю числа?
Памагити!
MCSE: Messaging, MCSE: Communication, MCSE: Productivity, MCSA: Office 365, MCPS
my blog - http://it-blojek.ru

Оффлайн Flyer_SPb

  • Модераторы
  • Ветеран
  • *****
  • Сообщений: 1019
  • Рейтинг: 26
  • Пол: Мужской
  • Ветеран войны с Kilrathi
    • Просмотр профиля
  • Откуда: 2:5030
Есть у нас специалисты по С++ ?
« Ответ #1 : 16 апреля 2021, 09:45:42 »
Какой-то у вас странный Це два креста.
Насколько я помню, #if / #endif всегда относилось к препроцессору и означало условную компиляцию, не?
They stole my gun, my beautiful Steltek gun!

Оффлайн Fray

  • Администратор
  • Олдфаг
  • *****
  • Сообщений: 6668
  • Рейтинг: 58
  • Пол: Мужской
    • Просмотр профиля
    • IT-Бложек
  • Откуда: Петербург
Есть у нас специалисты по С++ ?
« Ответ #2 : 16 апреля 2021, 09:49:57 »
#if / #endif всегда относилось к препроцессору и означало условную компиляцию, не?
Я, чесно гря, фиг его знает :) Я по паскалю больше.
Но не суть, сравнивать-то должно по идее?
MCSE: Messaging, MCSE: Communication, MCSE: Productivity, MCSA: Office 365, MCPS
my blog - http://it-blojek.ru

Оффлайн Flyer_SPb

  • Модераторы
  • Ветеран
  • *****
  • Сообщений: 1019
  • Рейтинг: 26
  • Пол: Мужской
  • Ветеран войны с Kilrathi
    • Просмотр профиля
  • Откуда: 2:5030
Есть у нас специалисты по С++ ?
« Ответ #3 : 16 апреля 2021, 09:55:32 »
#if / #endif всегда относилось к препроцессору и означало условную компиляцию, не?
Я, чесно гря, фиг его знает :) Я по паскалю больше.
Но не суть, сравнивать-то должно по идее?
Ага, на этапе компиляции. И если не - то этот код не компилируется.
А нормальный if выглядит как
if (условие)
 {
  код
 }
else
 {
  код
 }

 
They stole my gun, my beautiful Steltek gun!

Оффлайн Fray

  • Администратор
  • Олдфаг
  • *****
  • Сообщений: 6668
  • Рейтинг: 58
  • Пол: Мужской
    • Просмотр профиля
    • IT-Бложек
  • Откуда: Петербург
Есть у нас специалисты по С++ ?
« Ответ #4 : 16 апреля 2021, 09:58:13 »
Flyer_SPb, хм... а будет оно работать именно в этом месте? Просто этот кусок находится не в основном коде, а соседнем файле, который подключается через #include file.h
MCSE: Messaging, MCSE: Communication, MCSE: Productivity, MCSA: Office 365, MCPS
my blog - http://it-blojek.ru

Оффлайн airdwarf

  • Постоялец
  • ***
  • Сообщений: 371
  • Рейтинг: 7
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Чесслово, нашел, гражданин начальник!
Есть у нас специалисты по С++ ?
« Ответ #5 : 16 апреля 2021, 09:58:13 »
сравнивать-то должно по идее?
Да. Но только во время компиляции.  :fly:

Тащемта по-человечески это пишется так: https://ravesli.com/urok-65-operator-switch/
Ну и естественно, это все нужно завернуть в постоянно живущий объект класса, иначе предыдущий цвет учитываться не будет.
Кто чувствует несвободу воли, тот душевнобольной; кто отрицает ее, тот глуп. Один я умный в белом пальто стою красивый.
Вы тут серьёзно отстали от жизни. Админство, саппорт - это уже вчерашний день. Сейчас рулят микросервисная архитектура и continuous integration. Ну еще SAAS, конечно.

Оффлайн Fray

  • Администратор
  • Олдфаг
  • *****
  • Сообщений: 6668
  • Рейтинг: 58
  • Пол: Мужской
    • Просмотр профиля
    • IT-Бложек
  • Откуда: Петербург
Есть у нас специалисты по С++ ?
« Ответ #6 : 16 апреля 2021, 10:01:11 »
Тащемта по-человечески это пишется так: https://ravesli.com/urok-65-operator-switch/
Ну это по-человечески :)

Я так понимаю, что раз color++ отрабатывает и после компиляции, то можно туда просто нормальный if запихнуть и тоже будет работать?


Updated: 16 April 2021, 10:01:21

Просто этот кусок находится не в основном коде, а соседнем файле, который подключается через #include file.h
MCSE: Messaging, MCSE: Communication, MCSE: Productivity, MCSA: Office 365, MCPS
my blog - http://it-blojek.ru

Оффлайн airdwarf

  • Постоялец
  • ***
  • Сообщений: 371
  • Рейтинг: 7
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Чесслово, нашел, гражданин начальник!
Есть у нас специалисты по С++ ?
« Ответ #7 : 16 апреля 2021, 10:03:13 »
color++ отрабатывает и после компиляции
Логично, этот оператор компилируется в любом случае.

До компиляции в C++ не отрабатывает ни один оператор, это не интерпретируемый язык.


Updated: 16 April 2021, 10:04:03

то правильно туда просто нормальный if запихнуть

Но хороший стиль требует switch
Кто чувствует несвободу воли, тот душевнобольной; кто отрицает ее, тот глуп. Один я умный в белом пальто стою красивый.
Вы тут серьёзно отстали от жизни. Админство, саппорт - это уже вчерашний день. Сейчас рулят микросервисная архитектура и continuous integration. Ну еще SAAS, конечно.

Оффлайн Fray

  • Администратор
  • Олдфаг
  • *****
  • Сообщений: 6668
  • Рейтинг: 58
  • Пол: Мужской
    • Просмотр профиля
    • IT-Бложек
  • Откуда: Петербург
Есть у нас специалисты по С++ ?
« Ответ #8 : 16 апреля 2021, 10:13:21 »
Но хороший стиль требует switch
Я честно почитал, но не до конца понял синтаксис  :pardon:

Пока сделал так:

     #if IR_Key_Solid_Black
         case IR_Key_Solid_Black :            ///////////////////////////////////////////////////////////////////////////  Установить цвет Черный
                                  demorun = 0; ledMode = 255; palchg=0; color++;
                                    if (color == 0)
                                    {
                                      solid = CRGB::Black;
                                    }
                                    else if (color == 1)
                                    {
                                      solid = CRGB::Red;
                                    }
                                    else if (color == 2)
                                    {
                                      solid = CRGB::Orange;
                                    }
                                    else if (color == 3)
                                    {
                                      solid = CRGB::Yellow;
                                    }
                                    else if (color == 4)
                                    {
                                      solid = CRGB::Green;
                                    }
                                    else if (color == 5)
                                    {
                                      solid = CRGB::SkyBlue;
                                    }
                                    else if (color == 6)
                                    {
                                      solid = CRGB::Blue;
                                    }
                                    else if (color == 7)
                                    {
                                      solid = CRGB::Violet;
                                    }
                                    else if (color == 8)
                                    {
                                      solid = CRGB::White;
                                      color = 0;
                                    }
                                   
                 
                 
                                     #if LOG_ON == 1
                                      Serial.println(F("Solid_Black"));
                                      Serial.println(color);
                                    #endif
                                    break; 
                                 
        #endif

Скомпилировалось без ошибок, вечером залью и проверю. Спасибо :)
MCSE: Messaging, MCSE: Communication, MCSE: Productivity, MCSA: Office 365, MCPS
my blog - http://it-blojek.ru

Оффлайн airdwarf

  • Постоялец
  • ***
  • Сообщений: 371
  • Рейтинг: 7
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Чесслово, нашел, гражданин начальник!
Есть у нас специалисты по С++ ?
« Ответ #9 : 16 апреля 2021, 10:16:00 »
Скомпилировалось без ошибок
В случае плюсов это еще ни о чем не говорит.  :D
Для понимания, как это в теории должно работать, нужно видеть как минимум код класса и его инициализацию и вызовы целиком.
Кто чувствует несвободу воли, тот душевнобольной; кто отрицает ее, тот глуп. Один я умный в белом пальто стою красивый.
Вы тут серьёзно отстали от жизни. Админство, саппорт - это уже вчерашний день. Сейчас рулят микросервисная архитектура и continuous integration. Ну еще SAAS, конечно.

Оффлайн Fray

  • Администратор
  • Олдфаг
  • *****
  • Сообщений: 6668
  • Рейтинг: 58
  • Пол: Мужской
    • Просмотр профиля
    • IT-Бложек
  • Откуда: Петербург
Есть у нас специалисты по С++ ?
« Ответ #10 : 16 апреля 2021, 10:17:36 »
Собственно весь этот скетч лежит тут, посмотри, если интересно https://disk.yandex.ru/d/dL5-cMM_awGAAg
MCSE: Messaging, MCSE: Communication, MCSE: Productivity, MCSA: Office 365, MCPS
my blog - http://it-blojek.ru

Оффлайн airdwarf

  • Постоялец
  • ***
  • Сообщений: 371
  • Рейтинг: 7
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Чесслово, нашел, гражданин начальник!
Есть у нас специалисты по С++ ?
« Ответ #11 : 16 апреля 2021, 14:32:36 »
Fray, ну хрен знает, где ты определил переменную color и какие у нее область видимости и время жизни. Условие (color == 0) не выполнится никогда. А так если переменная будет жить между вызовами, то должно работать.


Updated: 16 April 2021, 14:34:04

И эта. В операторе сравнения константу принято писать слева. Чтобы компилятор выявил опечатку "=" вместо "==" и ругнулся на неожиданное присваивание.
Кто чувствует несвободу воли, тот душевнобольной; кто отрицает ее, тот глуп. Один я умный в белом пальто стою красивый.
Вы тут серьёзно отстали от жизни. Админство, саппорт - это уже вчерашний день. Сейчас рулят микросервисная архитектура и continuous integration. Ну еще SAAS, конечно.

Оффлайн Fray

  • Администратор
  • Олдфаг
  • *****
  • Сообщений: 6668
  • Рейтинг: 58
  • Пол: Мужской
    • Просмотр профиля
    • IT-Бложек
  • Откуда: Петербург
Есть у нас специалисты по С++ ?
« Ответ #12 : 16 апреля 2021, 14:41:58 »
где ты определил переменную color и какие у нее область видимости и время жизни
Я ее определили как int color; в основном коде где и остальные общие переменные...

Условие (color == 0) не выполнится никогда
Почему? ???


Updated: 16 April 2021, 14:43:13

А, кажись понял почему...


Updated: 16 April 2021, 14:45:52

Кажись так тогда :)

demorun = 0; ledMode = 255; palchg=0; color++; 
                                    if (color == 1)
                                    {
                                      solid = CRGB::Black;
                                    }
                                    else if (color == 2)
                                    {
                                      solid = CRGB::Red;
                                    }
                                    else if (color == 3)
                                    {
                                      solid = CRGB::Orange;
                                    }
                                    else if (color == 4)
                                    {
                                      solid = CRGB::Yellow;
                                    }
                                    else if (color == 5)
                                    {
                                      solid = CRGB::Green;
                                    }
                                    else if (color == 6)
                                    {
                                      solid = CRGB::SkyBlue;
                                    }
                                    else if (color == 7)
                                    {
                                      solid = CRGB::Blue;
                                    }
                                    else if (color == 8)
                                    {
                                      solid = CRGB::Violet;
                                    }
                                    else if (color == 9)
                                    {
                                      solid = CRGB::White;
                                      color = 0;
                                    }
MCSE: Messaging, MCSE: Communication, MCSE: Productivity, MCSA: Office 365, MCPS
my blog - http://it-blojek.ru

Оффлайн rjhdby

  • Постоялец
  • ***
  • Сообщений: 432
  • Рейтинг: 3
  • Пол: Мужской
    • rjhdby
    • Просмотр профиля
Есть у нас специалисты по С++ ?
« Ответ #13 : 18 мая 2021, 23:41:06 »
Но хороший стиль требует switch
Дедушка, а ты Ленина видел?
Не слушай его Фрай, если дороги тебе здравый рассудок и внутренняя гармония.
А вот тут можно посмотреть картины моей супруги http://sevil.pro

Оффлайн Fray

  • Администратор
  • Олдфаг
  • *****
  • Сообщений: 6668
  • Рейтинг: 58
  • Пол: Мужской
    • Просмотр профиля
    • IT-Бложек
  • Откуда: Петербург
Есть у нас специалисты по С++ ?
« Ответ #14 : 19 мая 2021, 08:43:16 »
Не слушай его Фрай, если дороги тебе здравый рассудок и внутренняя гармония.
Я и не послушал :) switch не осилил, быстрее esle if напихать кучу :)
MCSE: Messaging, MCSE: Communication, MCSE: Productivity, MCSA: Office 365, MCPS
my blog - http://it-blojek.ru