我在有限状态机中有一个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)值相反。
任何人都知道如何以一种好的方式来做这样的事情吗?
答案 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循环。