Во первых тут ничего сложного…)))
Во вторых, да, локальная переменная живёт только внутри области видимости, но я ее(область) и не покидаю…
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. Жаль, сейчас должен уйти
Такого не может быть
Так как у нас выполнение кода идёт “последовательно”, прерывания не в счёт…
Но в любом случае, там это один и тот же массив везде, это раз, второе - между этими событиями пройдёт милимининаносекунды)
Надеюсь BOOM не потрет ветку со зла… А то он уже её перенёс из начального места)))
Евгений Петрович лучче пестонов навставляет.
К его пистонам отношусь с уважением, если они по делу конечно)))
Меня интересует только работа с указателем в моем коде, т.е. с локальным массивом, переданным “из рук в руки” всем подряд))))
В остальном, я думаю, что у меня все верно…
ЗЫЖ Если что, разговор об коде в # 49
“Ну, во первых это красиво”.
На вопрос “пришейте мне член ко лбу”.)
С каких это пор рекурсия стала легче в понимании обычного цикла For? ))))))
Про гениталии я комментировать не буду… что там у кого пришито уже, пусть будет в тайне
А, ну если с указателями у вас проблема, тогда да, это очень сложно я реализовал… каюсь
Офигеть. Рекурсия, конечно, сложнее.
С указателями проблема не у меня одного, поинтересуйтесь.
Тогда я наверное не верно понял Вашу цитату… в кавычках… А затем еще и член)))
Навеяло “Во первых тут ничего сложного…)))”
Может и не совсем удачно.)
Моя беда, я иногда не понимаю людей и могу не верно им ответить
Что не так с моей фразой?))
Итог вопроса.
Вот две моих реализации, которые я сделал еще перед созданием этой темы. Т.е. ответ на вопрос у меня уже был, но знал, что можно это дело оптимизировать.
Первая, которую я показал в #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…
Уходил, вроде один ТС был, а пришёл - уже двое))
Не могёт этого быть.Вышли из функции - адъю. Один лишь адрес и воспоминания…

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

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

Не могёт этого быть.Вышли из функции - адъю
Спорить не буду, но там действительно один и тот же массив (Я очень на это надеюсь ))) ) Если нет, то буду переделывать, чтобы это был один и тот же массив… т.е. одна и та же область памяти… Ох уж эти указатели)))

Так это было задание? Ну простите, не распознал, я думал, просто совет нужен
Пошли придирки)))))
Ну простите и Вы… Как мне нужно было написать? В “совете” нужно было… )))))
Задание вообще-то для меня было… Эх и злые вы тут))))

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

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