由于试图使颜色饱和的数据类型范围有限,因此比较总是错误的

时间:2016-04-15 23:32:48

标签: c colors warnings compiler-warnings mandelbrot

我试图让我的颜色饱和,并确保它们不会溢出    这样他们就可以画出漂亮的Mandlebrot套装而不会出现像素化。 我正在使用Altera DE2板尝试通过VGA连接将这个Mandlebrot设置打印到计算机屏幕,颜色稍微偏离(像素)。

我如何更正下面代码中的if语句并不总是错误?

if (iteration == 500)
{
    alt_up_pixel_buffer_dma_draw(my_pixel_buffer,0,0,0);
}
else
{
    //double z = sqrt(xtemp * xtemp + y * y);
    //int brightness = 256. * log2(1.75 + i - log2(log2(z))) / log2(500);
    //color(brightness, brightness, 255);
    //color is some function of iteration
    alt_u8 Red = (iteration*8);///zoom);
    if(Red > 255) // this if statement is always false
        Red = 255;

    alt_u8 Green = (iteration*4);///zoom);
    if(Green > 255) // this if statement is always false
        Green = 255;

    alt_u8 Blue = (iteration*2);///zoom);
    if(Blue > 255) // this if statement is always false
        Blue = 255;

    //draw the pixels
    alt_up_pixel_buffer_dma_draw(my_pixel_buffer, (Blue) + (Green<<8) + (Red<<16),j,i);
}

2 个答案:

答案 0 :(得分:1)

您需要使用更大的整数来获取乘法的结果,因此您可以测试它是否超出限制。

alt_u8 Red;
uint16_t tempRed = iteration * 8;
if (tempRed > 255) {
    Red = 255;
} else {
    Red = tempRed;
}

答案 1 :(得分:0)

由于可以存储在alt_u8中的最大值是255,因此没有必要检查它是否包含更大的值。 (如果不是这种情况,即使alt_u8的类型不可见,也不会收到警告。)

但是,这也意味着您的分配是危险的,因为分配的值以模256的形式存储。您可能需要使用:

alt_u32 new_Red = iteration * 8;  // Guessed type; uint32_t or uint16_t would do
alt_u8 Red = new_Red;
if (new_Red > 255)
    Red = 255;

现在new_Red中的值可能超过255,但分配确保存储饱和值,而不是new_Red % 256,否则将存储。