Сбрасывается значение переменной

Здравствуйте!
Пишу дорожку громкости звука на ардуине нано, и столкнулся с проблемой: почему-то не могу нормально изменять значение переменной, она постоянно сбрасывается. Понимаю, звучит очень глупо, и чувствую я себя так-же, но реально не понимаю в чем проблема.
Собственно кусок кода, в котором проблема:

  Serial.print(ls);
  Serial.print(" ");
  Serial.print(l_maxval);
  if (ls > l_maxval) {
    l_maxval = 7;
  } else {
    //l_maxval = l_maxval * 0.995;
    //l_maxval = constrain(l_maxval, V_CUT, 2500);
  }
  Serial.print(" ");
  Serial.println(l_maxval);

в мониторе порта вижу следующее:
image
Переменная глобальная, объявлена в самом начале,

int l_maxval = 0;

и более нигде не используется, в остальных местах специально закомментировал. Т.е она меняется, но в конце loop() почему-то сбрасывается. Есть подозрения что дело в памяти, т.к сбрасываться она может не только на 0, но и на степени двойки, например 255(знаю что не 256, но подозрительно близко и стабильно), а при смене типа переменной на float сбрасывается только на 2. Но загрузчик на память не жалуется:

Скетч использует 9036 байт (29%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 471 байт (22%) динамической памяти, оставляя 1577 байт для локальных переменных. Максимум: 2048 байт.

int:
image
float:
image
Помогите, пожалуйста, понять в чем вообще может быть проблема, и куда копать/смотреть, подобные сбросы переменных просто так, или из-за (возможно) перегрузки памяти не нагуглил.

весь код: #include <FastLED.h>#define NUM_LEDS 50 #define DATA_PIN 10 #de - Pastebin.com

Дык, без кода никто ничего и не подскажет. По приведенному куску что-то понять нереально

1 лайк

опять секретный код? лично у меня все прекрасно работает.

1 лайк

прикрепил полный код

отдельно-то и у меня работает, а в полном коде, в котором, казалось-бы ничего на переменную не влияет, не работает. При этом такой же алгоритм для другой переменной прекрасно работает.

Где-то у тебя в другом месте что-то пишет в память, в которую писать не должно. Смотри на работу с указателями и массивами.

    for (int i = NUM_LEDS; i > NUM_LEDS / 2; i -= 1) {

например

с указателями все в порядке, а как может выглядеть неправильная работа с массивами, что она приводит к такой, как я понял, перезаписи памяти других переменных?

пару раз перепроверил, так и не понял, в чем тут может быть ошибка?

вот так

например, вот так:

CRGB leds[NUM_LEDS]; // Максимальный индекс NUM_LEDS-1
....
     if (leds[NUM_LEDS] = CRGB(0, 0, 0)) { // Опа! Писец!
        return;
      } else {
        for (int i = NUM_LEDS; i > NUM_LEDS / 2; i -= 1) {
       leds[i] = CRGB(0, 0, 0); // Опа! Ещё писец!

Мля, ВСТАЬТЕ ПОЛНЫЙ КОД СЮДА! Больше я за ним на левый сайт лазать не буду!

1 лайк

А ой, и действительно, в других местах тоже исправил, теперь работает :sweat_smile:
Совсем забыл, что компилятор такое пропускает, спасибо Вам большое

и вот это тоже работает как ожидалось?

if (leds[NUM_LEDS-1] = CRGB(0, 0, 0))

Надеюсь, Вы знаете, что делаете.