1

この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]]);
}
4

2 に答える 2

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

つまり、8 回ではなく 7 回だけ反復します。iii8 から 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]]);
于 2012-09-07T08:03:51.537 に答える
0

これをより明確にするために、代数方程式を解くときに大学で行ったのと同じように、(keycount - 1) を減算して数値を変換します (何かに役立つ必要がありました! 今日、その理由がわかりました :-)。あなたに残されたものは

 for (i = 0; i > -7; i--)

ここから、ループが 7 回繰り返されることが簡単にわかります (i は 0 から -6 の値を取ります)。jii<8常に真であり、結果に寄与しない部分を無視しました。

どこが間違っているのかという質問に答えるには、オフバイワンエラーのようです。>=あなたが書いた場所を意味しました>か?

于 2012-09-07T08:10:21.877 に答える