所以我只是试图填充连续数字0-255的缓冲区。我对此并没有多想,最终陷入了无限循环。
uint8_t i;
uint8_t txbuf[256];
for (i=0; i<256; i++) {
txbuf[i] = i;
}
问题是i
永远不会是256,因为它会在255之后翻到零。
我的问题是,有没有办法在不将i
高达16位值的情况下执行此循环?
注意:我知道我可以将循环更改为i<255
并为最终位置添加另一行,但我试图找出一种更好看的方式。
答案 0 :(得分:10)
uint8_t txbuf[256];
uint8_t i = 0;
do {
txbuf[i] = i;
} while (i++ != 255);
或
uint8_t txbuf[256];
uint8_t i = 255;
do {
txbuf[i] = i;
} while (i--);
答案 1 :(得分:5)
使用do ... while
循环,以便在检查条件之前执行操作:
uint8_t i = 0;
uint8_t txbuf[256];
do {
txtbuf[i] = i;
} while(i++ < 255);
答案 2 :(得分:3)
其他答案中的do..while循环可能就是你想要的,但是如果你特意想要使用for循环,你可以添加一个break语句:
uint8_t i;
uint8_t txbuf[256];
int main(void)
{
for (i=0; ; i++) {
txbuf[i] = i;
if (i == 255) break;
}
}
答案 3 :(得分:2)
uint8_t
的范围是0-255,因此永远不会变为256。
既然我们看到你的数组也是uint8_t类型,那么它可以存储的值也是0-255,那么是什么让你循环大于255的值?
只需将支票保留为i<255
,当您退出循环时,您知道i的值为255,请相应地使用它。
否则按其他人的建议使用do while
。
答案 4 :(得分:1)
以下gcc(5.0)具有检查是否发生溢出的功能。
uint8_t i = 0;
uint8_t txbuf[256];
do
{
txbuf[i] = i;
}while(!__builtin_add_overflow(i,1,i));
的更多详情
答案 5 :(得分:0)
考虑一下:
uint8_t txbuf[256];
uint8_t i = 0;
do {
txtbuf[i] = i;
} while(++i != 0);
该代码允许更改类型。