我不确定我是否在这个for循环中遗漏了一些东西。 我希望它能在循环内执行8次代码,这将导致它在LCD上输出8个字符,但是它循环7次,我只看到7个字符。 我正在使用Keil编译器。 请问有人能发现我弄错了吗?
//keycount = 9
for ( iii = (keycount-1),jii = 0; iii > (keycount-8) && jii <8; iii--,jii++)
{
LCD_Data_Write (jii,Digit_Mask[keybuff[iii]]);
}
答案 0 :(得分:1)
好的,循环体中的任何内容都不会更改控制它的变量,所以它全部都归结为循环本身。
只需写下初始值并在脑中运行循环:
//keycount = 9
for ( iii = (keycount-1),jii=0; iii>(keycount-8) && jii <8;iii--,jii++)
iii jii iii > 1 jii < 8
--- --- ------- -------
8 0 Y Y iterate 1
7 1 Y Y iterate 2
6 2 Y Y iterate 3
5 3 Y Y iterate 4
4 4 Y Y iterate 5
3 5 Y Y iterate 6
2 6 Y Y iterate 7
1 7 N Y exit loop
换句话说,它只迭代七次,而不是八次。我怀疑你打算将iii
从8减少到1(而不是2)。如果是这种情况,整个循环可以用更简单的东西替换。
// keycount = 9
for (jii = 0; jii < 8; jii++)
LCD_Data_Write (jii, Digit_Mask[keybuff[8-jii]]);
事实上,即使值的范围从7到0,只需将调用更改为:
LCD_Data_Write (jii, Digit_Mask[keybuff[7-jii]]);
答案 1 :(得分:0)
为了更清楚,通过减去(keycount - 1)来转换数字,就像在大学解决代数方程时一样(它必须对某事有用)今天你知道为什么:-)。你剩下的就是
for (i = 0; i > -7; i--)
从中很容易看出循环被迭代7次(我从0到-6取值)。我忽略了始终为真的jii<8
部分,因此对结果没有贡献。
要回答您错误的问题:它似乎是 off-by-one 错误。您的意思是>=
您写的>
?