Алгоритм выбора с условием

Дали бы время, я бы разобрался в этом :wink: , но сейчас я в рейсе… Когда вернусь хз… Рекурсии они такие… Есть мысль, но её проверить нужно…

А для этого нужно делать отдельный счетчик.

И, кстати, рекурсия здесь не оптимальный вариант.

Лучше скажи - откуда там 5 и 6 появляются? )

Так ты приведи полный код, в котором это проявляется.

Рекурсия она же ещё возвращается назад… Попробуйте только одну последнюю еденицу оставьте в массиве. Или только первую…

Так в 15 у него полный код же…

Этот код работает.
Нужен тот, который неисправен.

Не, ну как дети. Сами новичкам по 10 раз повторяем, что приводить нужно именно тот код, который не исправен, а не похожий, но с дюжиной правок.

1 лайк

Там массив немного нужно изменить… В следующем сообщении сказано…

Вот этот код со всеми изменениями и нужно привести.
Если я сам вношу изменения, у меня код работает.

Но вообще, у меня вызывает сомнение строка 11. После этого в строке 21 происходит обращение за границу массива.

2 лайка

И вообще, мне кажется, вы усложняет это всё… Рекурсия точно лишняя… Как сказал ник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 у пунктов… На всякий случай…
Но всё равно этот алгоритм сложный, я приеду сделаю (если получится) :slight_smile: ещё один вариант…

Попкорн закупать? :smiley:

Можно и с попкорном…) только пока я доберусь до компа, боюсь, он уже у вас закончится)))
Ну а так, действительно, слишком сложно у вас получилось, я хотел упростить (кстати который вариант назрел , должен быть самым простым и так же со сменой кол-ва пунктов) а вы сделали сложнее чем у меня, но есть плюс (пока) - можно менять кол-во “пунктов”…

В чем там сложность то?
Ну ладно, жду твоих «улучшений». Только долго не томи!

Ок, ну теперь как приеду…)

Это через сколько? Через месяц?

Нет) надеюсь завтра… послезавтра уже дома буду…