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

Во первых тут ничего сложного…)))
Во вторых, да, локальная переменная живёт только внутри области видимости, но я ее(область) и не покидаю…
IArr живёт в луп, и на каждом витке создаётся вновь… Но на протяжении витка она жива и имеет права быть передана в другую функцию…

byte getNextIndex (byte CurrInd, byte Arr[], byte itemCount) {
  if (CurrInd >= itemCount) return 0;
  for (byte n = CurrInd; n < itemCount; n++)
    if (Arr[n]) return n + 1;
  return 0;
}

А в стр4 вы что проверяете, тот же массив, что "“живёт” в loop?
А вдруг он уже изменился?

P.S. Жаль, сейчас должен уйти

Такого не может быть
Так как у нас выполнение кода идёт “последовательно”, прерывания не в счёт…

Но в любом случае, там это один и тот же массив везде, это раз, второе - между этими событиями пройдёт милимининаносекунды):wink:

Надеюсь BOOM не потрет ветку со зла… А то он уже её перенёс из начального места)))

Евгений Петрович лучче пестонов навставляет.

К его пистонам отношусь с уважением, если они по делу конечно)))
Меня интересует только работа с указателем в моем коде, т.е. с локальным массивом, переданным “из рук в руки” всем подряд))))
В остальном, я думаю, что у меня все верно…
ЗЫЖ Если что, разговор об коде в # 49

“Ну, во первых это красиво”.
На вопрос “пришейте мне член ко лбу”.)

С каких это пор рекурсия стала легче в понимании обычного цикла For? ))))))
Про гениталии я комментировать не буду… что там у кого пришито уже, пусть будет в тайне :wink:
А, ну если с указателями у вас проблема, тогда да, это очень сложно я реализовал… каюсь

Офигеть. Рекурсия, конечно, сложнее.
С указателями проблема не у меня одного, поинтересуйтесь.

Рекурсия:


Сам в себе :slight_smile:

Тогда я наверное не верно понял Вашу цитату… в кавычках… А затем еще и член)))

Навеяло “Во первых тут ничего сложного…)))”
Может и не совсем удачно.)

Моя беда, я иногда не понимаю людей и могу не верно им ответить :frowning:
Что не так с моей фразой?))

Итог вопроса.
Вот две моих реализации, которые я сделал еще перед созданием этой темы. Т.е. ответ на вопрос у меня уже был, но знал, что можно это дело оптимизировать.
Первая, которую я показал в #8:

Спойлер
bool a, b, c;
byte ind;

void setup() {
  Serial.begin(115200);
  //тут меняем у пунктов возможность выбора
  a = c = true; b = false;
  ind = 0;
}

byte getNextIndex(byte currInd) {
  if (currInd == 3) return 0;
  if (currInd == 0) if (a) return 1;
        else if (b) return 2; else if (c) return 3; else return 0;
      if (currInd == 1) if (b) return 2; else if (c) return 3; else return 0;
    if (currInd == 2) if (c) return 3; else return 0;
}

void loop() {
  ind = getNextIndex(ind) ;
  Serial.println(ind);
  delay(500);
}

Вторая:

Спойлер
bool a, b, c;
byte x;

void setup() {
  Serial.begin(115200);
  a = false; b = false; c = true;
  x = 0;
}

byte getNextIndex(byte ix) {
  if (x == 3) return 0;
  for (byte n = ix; n < 3; n++) {
    switch (n) {
      case 0: if (a) return 1;
        break;
      case 1: if (b) return 2;
        break;
      case 2: if (c) return 3;
        else return 0;
        break;
    }
  }
}

void loop() {
  x = getNextIndex(x);
  Serial.println(x);
  delay(500);
}

Рабочие, но с другим кол-вом итемов, придется переделать…

Третья реализация, которая пришла в голову в дороге, в кабине локомотива)) Читая этот форум, но которая вызвала критику (пока безосновательную) некоторых людей…:

Спойлер
#define ITEM_COUNT 5
byte Ind;

byte * fillArr(byte Arr[], byte ArrCnt) {
  Arr[0] = 0;
  Arr[1] = 0;
  Arr[2] = 0;
  Arr[3] = 0;
  Arr[4] = 0;
  //for (byte n = 0; n < ArrCnt; n++) Arr[n] = random(10);
  return Arr;
}

byte getNextIndex (byte CurrInd, byte Arr[], byte itemCount) {
  if (CurrInd >= itemCount) return 0;
  for (byte n = CurrInd; n < itemCount; n++)
    if (Arr[n]) return n + 1;
  return 0;
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  byte IArr[ITEM_COUNT];
  Ind = getNextIndex (Ind, fillArr(IArr, ITEM_COUNT), ITEM_COUNT);
  Serial.println(Ind);
  delay(500);
}

Так же сюда вариант от BOOM with v258 из #34

Спойлер
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);
}

Все варианты проверены, не досконально, но…
У последнего варианта (BOOM и v258) не верно реализовано задание… Нет возможности вернуть - 0 А в вопросе я указывал, что 0 - это не выбран ни один пункт…

А должно быть 2 4 0 2 4 0 2 4 0 2 4…

За идею с массивом спасибо andriano из #9 и Дим-мычъ

Уходил, вроде один ТС был, а пришёл - уже двое))

Не могёт этого быть.Вышли из функции - адъю. Один лишь адрес и воспоминания…

Но может хватить и одного такта. Я этот урок вроде усвоил, избегаю это теперь . А там хозяин - барин))

Так это было задание? Ну простите, не распознал, я думал, просто совет нужен

1 лайк

Спорить не буду, но там действительно один и тот же массив (Я очень на это надеюсь ))) ) Если нет, то буду переделывать, чтобы это был один и тот же массив… т.е. одна и та же область памяти… Ох уж эти указатели)))

Пошли придирки)))))
Ну простите и Вы… Как мне нужно было написать? В “совете” нужно было… )))))

Задание вообще-то для меня было… Эх и злые вы тут))))

Это уже паранойя… в МК “нет” многозадачности…))) В прочем это уже тоже придирки… в таком ключе я и к рекурсивной… и к любой другой могу придраться…

Каком в пол. В том примере был показан простой перебор пунктов, а не выбор конкретного. Так что уж простите, что задание не выполнили