Форум системных администраторов

General => Главный => Тема начата: Fray от 16 апреля 2021, 09:16:44

Название: Есть у нас специалисты по С++ ?
Отправлено: Fray от 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 в любое место куска кода - работает.
Может я как-то неправильно сравниваю числа?
Памагити!
Название: Есть у нас специалисты по С++ ?
Отправлено: Flyer_SPb от 16 апреля 2021, 09:45:42
Какой-то у вас странный Це два креста.
Насколько я помню, #if / #endif всегда относилось к препроцессору и означало условную компиляцию, не?
Название: Есть у нас специалисты по С++ ?
Отправлено: Fray от 16 апреля 2021, 09:49:57
#if / #endif всегда относилось к препроцессору и означало условную компиляцию, не?
Я, чесно гря, фиг его знает :) Я по паскалю больше.
Но не суть, сравнивать-то должно по идее?
Название: Есть у нас специалисты по С++ ?
Отправлено: Flyer_SPb от 16 апреля 2021, 09:55:32
#if / #endif всегда относилось к препроцессору и означало условную компиляцию, не?
Я, чесно гря, фиг его знает :) Я по паскалю больше.
Но не суть, сравнивать-то должно по идее?
Ага, на этапе компиляции. И если не - то этот код не компилируется.
А нормальный if выглядит как
if (условие)
 {
  код
 }
else
 {
  код
 }

 
Название: Есть у нас специалисты по С++ ?
Отправлено: Fray от 16 апреля 2021, 09:58:13
Flyer_SPb, хм... а будет оно работать именно в этом месте? Просто этот кусок находится не в основном коде, а соседнем файле, который подключается через #include file.h
Название: Есть у нас специалисты по С++ ?
Отправлено: airdwarf от 16 апреля 2021, 09:58:13
сравнивать-то должно по идее?
Да. Но только во время компиляции.  :fly:

Тащемта по-человечески это пишется так: https://ravesli.com/urok-65-operator-switch/
Ну и естественно, это все нужно завернуть в постоянно живущий объект класса, иначе предыдущий цвет учитываться не будет.
Название: Есть у нас специалисты по С++ ?
Отправлено: Fray от 16 апреля 2021, 10:01:11
Тащемта по-человечески это пишется так: https://ravesli.com/urok-65-operator-switch/
Ну это по-человечески :)

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


Updated: 16 April 2021, 10:01:21

Просто этот кусок находится не в основном коде, а соседнем файле, который подключается через #include file.h
Название: Есть у нас специалисты по С++ ?
Отправлено: airdwarf от 16 апреля 2021, 10:03:13
color++ отрабатывает и после компиляции
Логично, этот оператор компилируется в любом случае.

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


Updated: 16 April 2021, 10:04:03

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

Но хороший стиль требует switch
Название: Есть у нас специалисты по С++ ?
Отправлено: Fray от 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

Скомпилировалось без ошибок, вечером залью и проверю. Спасибо :)
Название: Есть у нас специалисты по С++ ?
Отправлено: airdwarf от 16 апреля 2021, 10:16:00
Скомпилировалось без ошибок
В случае плюсов это еще ни о чем не говорит.  :D
Для понимания, как это в теории должно работать, нужно видеть как минимум код класса и его инициализацию и вызовы целиком.
Название: Есть у нас специалисты по С++ ?
Отправлено: Fray от 16 апреля 2021, 10:17:36
Собственно весь этот скетч лежит тут, посмотри, если интересно https://disk.yandex.ru/d/dL5-cMM_awGAAg
Название: Есть у нас специалисты по С++ ?
Отправлено: airdwarf от 16 апреля 2021, 14:32:36
Fray, ну хрен знает, где ты определил переменную color и какие у нее область видимости и время жизни. Условие (color == 0) не выполнится никогда. А так если переменная будет жить между вызовами, то должно работать.


Updated: 16 April 2021, 14:34:04

И эта. В операторе сравнения константу принято писать слева. Чтобы компилятор выявил опечатку "=" вместо "==" и ругнулся на неожиданное присваивание.
Название: Есть у нас специалисты по С++ ?
Отправлено: Fray от 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;
                                    }
Название: Есть у нас специалисты по С++ ?
Отправлено: rjhdby от 18 мая 2021, 23:41:06
Но хороший стиль требует switch
Дедушка, а ты Ленина видел?
Не слушай его Фрай, если дороги тебе здравый рассудок и внутренняя гармония.
Название: Есть у нас специалисты по С++ ?
Отправлено: Fray от 19 мая 2021, 08:43:16
Не слушай его Фрай, если дороги тебе здравый рассудок и внутренняя гармония.
Я и не послушал :) switch не осилил, быстрее esle if напихать кучу :)