Замкнутый контур значений 0-23; 23-0

Сие высказывание есть признак глубокого непонимания предмета.

“профессиональное решение” никак не коррелирует с “дойдёт до регистров”. Это про разное.

И как же по вашему это должно выглядеть? На сколько мне известно, для программы старт начинается с нуля. Человек считает с 1цы и что е тут не так?

0-23 - это 24 значения, как ни считай. И “человеческое” понимание тут не при чем.
Возьмите любые часы с 24 часовым ходом. В них нет вашего 1- 24, потому на экране вы никогда не увидите время 24:20, вместо этого будет 0:20.

Просто. Если у Вас есть две пятитысячные купюры, то их у Вас две независимо от того, называете Вы их “нулевая и первая” или “первая и вторая”. Если же у Вас в каком-то случае получается только одна купюра, то вторую можете смело отдать мне. Я буду считать, что Вы мне дали одну, даже если она нулевая (за нулевую неустойку требовать не буду).

А задачу Вашу красиво решать:

вот так
static constexpr uint8_t gTotalDiodes = 24;

template <uint8_t Total>
class SDiodeNumber {
	uint8_t m_n;
	SDiodeNumber inc(void) { return m_n = (m_n + 1) % Total; }
public:
	SDiodeNumber(const uint8_t n = 0) : m_n(n) {}
	operator uint8_t(void) const { return m_n; }
	SDiodeNumber & operator ++ (void) { inc(); return *this; }
	SDiodeNumber operator ++ (int) { uint8_t res = m_n; inc(); return SDiodeNumber(res); }
	SDiodeNumber operator + (const int n) { 
		return SDiodeNumber((m_n + static_cast<uint8_t>(n)) % Total);
	}
	SDiodeNumber operator - (const int n) { 
		uint8_t nn = n % Total;
		return SDiodeNumber((nn > m_n ? (m_n + Total) : m_n) - nn);
	}
};

void setup(void) {
	Serial.begin(9600);

	Serial.println("Бесконечный бег по кругу");

	for (SDiodeNumber<gTotalDiodes> d = 0;; d++) {
		Serial.print(d - 2); Serial.print(", ");
		Serial.print(d - 1); Serial.print(", ");
		Serial.print(d); Serial.print(", ");
		Serial.print(d + 1); Serial.print(", ");
		Serial.println(d + 2); 
		delay(200); // хоть разглядеть успеть
	}
}

void loop(void) {}

Запустите, посмотрите. Все “+” и “-” нормально отрабатывают.

1 лайк

Спорить не буду. А решение задачи отличное. Я оказывается для это кода туповат, пойду по нему разбираться. Спасибо)))

самокритично однако )))

1 лайк

Я же уже приводил стих:
Однажды, в студёную зимнюю пору,
Сансара примёрзла манасом к забору!


Если ума нет, то шо цэ таке “Манас”? :wink:

Мужик, капец ты жёсткий. Мы в две головы штурмуем твой код. Крутой код!)

Скетч использует 2146 байт (6%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 236 байт (11%) динамической памяти, оставляя 1812 байт для локальных переменных. Максимум: 2048 байт.

Этот красивый код называется обфускация IF…? Даже не знаю - смог бы я защитить этот код перед преподавателем … И где найти такого преподавателя, который поймёт оценит этот код !!!

static constexpr uint8_t gTotalDiodes = 24;

void setup () {
  Serial.begin(9600);
  Serial.println("Start");
}

void print(int8_t  x) {
  x%=gTotalDiodes;
  if (x<0) x+=gTotalDiodes;
  Serial.print(x);
  Serial.print(", ");
};

void loop() {
  for (uint8_t x=0;x<gTotalDiodes;x++) {
    print(x-2);
    print(x-1);
    print(x);
    print(x+1);
    print(x+2);
    Serial.println();
  };
}

Скетч использует 2132 байт (6%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 196 байт (9%) динамической памяти, оставляя 1852 байт для локальных переменных. Максимум: 2048 байт.

Классы любят ОЗУ …

1 лайк

это концептуальная засада )))

Блин. Круто. Обфускация хорошая штука) Спасибо!

С “бабами и блэкджеком” - dsa_a - Wokwi Arduino and ESP32 Simulator

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

Ой, вот только не не надо про ОЗУ, ну ведь много раз уже обсуждали, что ничего такого они не любят. Готовить надо уметь. Не надоело ещё?

Вот и в данном случае. Ваш вариант на самом деле жрёт ровно столько же памяти данных. Вы просто сжульничали при сравнении. У Вас коротенькая строка №5 соответствует моей №24 с большим текстом. Закомментируйте обе (Вашу №5 и мою №24) и скомпилируйте, получите:

у Вас: 190 байт (9%) динамической памяти
у меня: 190 байт (9%) динамической памяти

Сравнивать надо корректно. Хотя, специально я никакой оптимизацией не занимался. Мне хотелось просто показать ТС введение собственного типа данных.

А по поводу самой программы, так у меня универсальное решение, а у Вас только на случай маленьких отклонений (например, что она у Вас сделает если попытаться вычесть число, большее, чем gTotalDiodes)? Т.е. мы просто решали разные задачи, я показывал, как определить свой тип данных, а Вы решали конкретную задачу про “-1” и “-2”.

так будет “Пятничная битва Титанов”? а то я уже руки потираю в надежде знания впитать )))

1 лайк

Разрешите уточнить для д&билла, а именно для себя. Ваш код был написан целиком вручную?

Нет, не будет. А чего тут биться? В данном примере память данных одинаковая - это факт и биться не о чем.

Ни в каике общие дискуссии о “классах и ОЗУ” я вступать не буду, надоело. Сколько раз уже было. Так что с моим участием никакой битвы точно не будет.

Если кто другой решит побиться - пожалуйста, попкорна у меня достаточно :slight_smile:

Не понял вопроса, но если Вы спрашиваете, использовал ли я какие-то кодогенераторы, то нет. А Вы думали, его ChatGPT написал?

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