用c语言编程多条件循环

时间:2019-01-16 18:10:02

标签: c lcd state-machine

我在有限状态机中有一个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;
        }
    }

}

状态机用于在LCD显示屏上显示菜单。 (我使用了我在网上找到的用于状态机的示例,并将其用于我的微控制器系统)。

一切正常,菜单系统也可以,但是我现在想在菜单中添加相邻的文本行(以便更轻松地查看菜单中的位置)。 (原始菜单用于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语句,但是看起来都很...混乱... 大而笨拙的代码...

所以我想达到的目标是,例如,当“ a”变为4时,它应该变为0。下一次for循环运行时,它应该变为1。 b,c和d相同。并且彼此之间应保持相同的“距离”(当b为2时c应为3,d应为4等)

相同的想法,但与MIN(0)值相反。

任何人都知道如何以一种好的方式来做这样的事情吗?

2 个答案:

答案 0 :(得分:4)

您可以代替杂乱的int a

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

以此类推。

编辑: 通过确保菜单“重新包装”回到开始,这也可以解决菜单溢出的问题。除了使用i + 1等访问下一个菜单项外,它还使用模数(或余数)运算符%来实现此目的。

答案 1 :(得分:0)

我只使用一个变量来控制您的for循环增量:

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

正如Weather Vane回答的那样,您然后可以在for循环的主体中处理数组索引偏移量。这更加清晰和强大。

对于您用作for循环条件的变量,我也要小心。 在代码中,您使用menu_statetop [i] .state变量,该变量似乎是整数/枚举。 如果没有“中断”;在循环中,只要menu_statetop [i] .state中包含的值不等于0,就会执行for循环。