0

当这个循环回到 dd[0] 周围时设置为 0 与 256.1 相对?似乎 'dd' 内存正在重置, 'aa' 回到 0。

unsigned char aa = 0;
double *dd = new double[256];

//circular buffer
dd[aa] = 0.1;
for(int i = 0; i < 600; i++){
    qstr += QString::number(aa,'d',0) + "  " + QString::number(dd[aa],'f',1) + "         ";
    aa++;//onces 'aa' reaches 255, the next increment resets back to 0 for 'aa'
    dd[aa] = dd[aa - 1] + 1;
}
4

4 回答 4

3

您已aa声明为unsigned char. 因此,当您达到 255 并递增时,它会回到 0。您可能应该使用 int,因为该变量用作数组索引变量。

于 2013-08-09T15:57:46.890 回答
2

这是因为当aa255它增加一时,0因为unsigned char,所以它现在变成dd[0] = dd[-1] + 1了任何junk可以存在的dd[-1]地方,在这里似乎你有-1

此外,您正在访问超出其边界的数组,这是一种未定义的行为。你应该尽量避免 when aabecome 0

于 2013-08-09T16:01:29.237 回答
0

无符号字符是 8 位长。unsigned char 可以容纳的最大数字是 255。(二进制 1111111)。如果将其增加 1,它将变为 0

于 2013-08-09T16:01:04.670 回答
0

我做了铸造以避免aa = -1:

    dd[aa] = 0.1;
    for(int i = 0; i < 600; i++){
        qstr += QString::number((unsigned char)((unsigned char)aa-(unsigned char)1),'d',0) + "  " + QString::number(dd[aa],'f',1) + "         ";
        aa++;
        dd[aa] = dd[(unsigned char)((unsigned char)aa-(unsigned char)1)] + 1;  // casting
    }
于 2013-08-09T16:07:41.567 回答