c программирование цикла с несколькими условиями - PullRequest
0 голосов
/ 16 января 2019

У меня есть цикл foor в конечном автомате:

if (nextstate != state)
{
    state = nextstate;
    for (i=0; menu_state[i].state; i++)
    {
        if (menu_state[i].state == state)
        {
            statetext =  menu_state[i].pText;
            pStateFunc = menu_state[i].pFunc;
            break;
        }
    }

}

Конечный автомат используется для отображения меню на ЖК-дисплее. (Я использовал пример, который я нашел в Интернете для конечного автомата, и адаптировал его для своей системы микроконтроллера).

Все работает нормально, система меню работает, но теперь я хотел бы добавить смежные текстовые строки в меню (чтобы было легче видеть, где вы находитесь в меню). (исходное меню было для отображения 1 строки, а у меня отображение 5 строк).

Итак, мой вывод: мне нужно адаптировать это для цикла.

Вот что я придумал:

if (nextstate != state)
{
    state = nextstate;

    for (i=0,a=1,b=2,c=3,d=4; menu_statetop[i].state; i++,a++,b++,c++,d++)
    {

        if (menu_statetop[i].state == state)
        {
            statetext=  menu_statetop[i].pText;
            statetext2=  menu_statetop[a].pText;
            statetext3=  menu_statetop[b].pText;
            statetext4=  menu_statetop[c].pText;
            statetext5=  menu_statetop[d].pText;

            pStateFunc = menu_statetop[i].pFunc;
            break;
        }
    }

}

Кажется, это работает более или менее ... но проблема в границе. Потому что в справочной таблице 5 строк. и когда переменные становятся больше, чем это значение MAX (4), они выходят за пределы допустимого значения MAX для поиска и показывают мусор.

Я пытаюсь найти элегантное решение для этого. Есть идеи? Я рассмотрел использование операторов if, но все выглядит так ... грязно ... большой и комковатый код ...

Так что я пытаюсь достичь, например, когда «а» становится 4, оно должно стать 0. и в следующий раз при выполнении цикла for оно должно стать 1. то же самое для b, c и d. и они должны поддерживать одинаковое «расстояние» друг от друга (когда b равно 2, c должно быть 3, d должно быть 4 и т. д.)

Та же идея, но противоположная для значения MIN (0).

У кого-нибудь есть идеи, как сделать что-то подобное хорошим способом?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я бы просто использовал одну переменную для управления приращением цикла for:

    for (i=0; menu_statetop[i].state; i++)

В ответ на Weather Vane вы можете обработать смещение индекса массива в теле цикла for.Это намного понятнее и надежнее.

Я бы также был осторожен с переменной, которую вы используете в качестве условия для цикла for.в вашем коде вы используете переменную menu_statetop [i] .state, которая выглядит как целое число / enum.Если бы не было "перерыва";в цикле цикл for будет выполняться до тех пор, пока значение, содержащееся в menu_statetop [i] .state, не равно 0.

0 голосов
/ 16 января 2019

Вместо грязного int a и т. Д. Вы можете сделать

menu_statetop[(i + 1) % 5].pText;
menu_statetop[(i + 2) % 5].pText;
menu_statetop[(i + 3) % 5].pText;

и т. Д.

EDIT: Это также устраняет переполнение меню, гарантируя, что оно «возвращается» к началу. Помимо доступа к следующему пункту (пунктам) меню с помощью i + 1 и т. Д., Он использует оператор модуля (или остатка) % для достижения этой цели.

...