Дали бы время, я бы разобрался в этом , но сейчас я в рейсе… Когда вернусь хз… Рекурсии они такие… Есть мысль, но её проверить нужно…
А для этого нужно делать отдельный счетчик.
И, кстати, рекурсия здесь не оптимальный вариант.
Лучше скажи - откуда там 5 и 6 появляются? )
Так ты приведи полный код, в котором это проявляется.
Рекурсия она же ещё возвращается назад… Попробуйте только одну последнюю еденицу оставьте в массиве. Или только первую…
Так в 15 у него полный код же…
Этот код работает.
Нужен тот, который неисправен.
Не, ну как дети. Сами новичкам по 10 раз повторяем, что приводить нужно именно тот код, который не исправен, а не похожий, но с дюжиной правок.
Там массив немного нужно изменить… В следующем сообщении сказано…
Вот этот код со всеми изменениями и нужно привести.
Если я сам вношу изменения, у меня код работает.
Но вообще, у меня вызывает сомнение строка 11. После этого в строке 21 происходит обращение за границу массива.
И вообще, мне кажется, вы усложняет это всё… Рекурсия точно лишняя… Как сказал ник182 в самом начале ещё, что самый оптимальный вариант - тупо перебор. Ну а для смены кол-ва пунктов изменить функцию…
Впрочем приеду, попробую ещё одну мысль реализовать, навеянную массивами)))
Понятно… Я то не пробовал… Я в телефоне смотрю…
Благодарю! Я тоже на это место “грешил”, но решил не менять.
После того как код подправил (проверки перед использованием), все работает как нужно:
const uint8_t maxItem = 5;
uint8_t menuItemStat[] = {0, 0, 1, 0, 1};
uint8_t currentIndex = 0;
uint8_t getNextIndex(uint8_t currInd);
void setup() {
Serial.begin(9600);
for (uint8_t i = 0; i < 10; i++) {
Serial.println(currentIndex);
currentIndex = getNextIndex(currentIndex);
}
}
void loop() {
}
uint8_t getNextIndex(uint8_t currInd) {
currInd++;
if ( currInd > (maxItem - 1) ) {
currInd = 0;
}
if ( menuItemStat[currInd] ) { //если пункт меню активен
return currInd;
}
return getNextIndex(currInd);
}
Вывод:
0
2
4
2
4
2
4
2
4
2
Ну и то, что @v258 предложил, и хватит думаю:
struct TmenuItem {
public:
bool active;
char* name;
};
TmenuItem MenuItems[] {
TmenuItem{
true,
"First item"},
TmenuItem{
true,
"Second item"},
TmenuItem{
false,
"Third item"},
TmenuItem{
true,
"LastItem"}
};
const uint8_t maxItem = sizeof(MenuItems) / sizeof(TmenuItem);
uint8_t currentIndex = 0;
uint8_t getNextIndex(uint8_t currInd);
void setup() {
Serial.begin(9600);
for (uint8_t i = 0; i < 10; i++) {
Serial.println(MenuItems[currentIndex].name);
currentIndex = getNextIndex(currentIndex);
}
}
void loop() {
}
uint8_t getNextIndex(uint8_t currInd) {
currInd++;
if ( currInd > (maxItem - 1) ) {
currInd = 0;
}
if ( MenuItems[currInd].active ) { //если пункт меню активен
return currInd;
}
return getNextIndex(currInd);
}
Вывод:
First item
Second item
LastItem
First item
Second item
LastItem
First item
Second item
LastItem
First item
Проверьте этот алгоритм с динамичной сменой “доступности” меню. Т. Е. Перед каждым вызовом getNextIndex случайно менять active у пунктов… На всякий случай…
Но всё равно этот алгоритм сложный, я приеду сделаю (если получится) ещё один вариант…
Попкорн закупать?
Можно и с попкорном…) только пока я доберусь до компа, боюсь, он уже у вас закончится)))
Ну а так, действительно, слишком сложно у вас получилось, я хотел упростить (кстати который вариант назрел , должен быть самым простым и так же со сменой кол-ва пунктов) а вы сделали сложнее чем у меня, но есть плюс (пока) - можно менять кол-во “пунктов”…
В чем там сложность то?
Ну ладно, жду твоих «улучшений». Только долго не томи!
Ок, ну теперь как приеду…)
Это через сколько? Через месяц?
Нет) надеюсь завтра… послезавтра уже дома буду…