我需要帮助..我正在制作一个模仿油漆桶的功能..当一半图像被着色时出现问题这个错误发生“NTVM遇到了非法指令”
这是我的“桶”代码:
void bucket(int x, int y, int fillColor)
{
if(getpixel(x,y)==getpixel(x,y+1)){
putpixel(x,y,fillColor);
bucket(x,y+1,fillColor);
}
if(getpixel(x,y)==getpixel(x+1,y)){
putpixel(x,y,fillColor);
bucket(x+1,y,fillColor);
}
if(getpixel(x,y)==getpixel(x,y-1)){
putpixel(x,y,fillColor);
bucket(x,y-1,fillColor);
}
if(getpixel(x,y)==getpixel(x-1,y)){
putpixel(x,y,fillColor);
bucket(x-1,y,fillColor);
}
}
据说“填充”算法的问题在于你的递归堆栈不支持所有调用...至少有一半的图形是彩色的..
PS:我正在使用
在Borland c ++ v3.1上运行它答案 0 :(得分:1)
我会想到甜甜圈的美元,你正在炸掉你的筹码。 NTVM是Windows的dos模拟器。我猜它有一个有限的堆栈。尝试寻址堆栈外部的内存(可寻址范围)会导致非法指令。这也可以解释为什么你只能获得大图片。
答案 1 :(得分:1)
在您运行的代码中,递归永远不会结束......当存储桶到达图像的边界(顶部,底部,左侧或右侧)时,您应该停止递归。
还有另一个问题:每次调用函数都会调用其他四个函数。这意味着即使您为图像边框添加特殊if,递归也永远不会结束,因为例如像素(x,y)上的桶调用bucket(x + 1,y)和像素(x + 1,y)上的桶调用存储桶(x-1,y)实际上是像素(x,y)!
我的建议是添加特殊的函数参数,比如,, direction''。考虑四个方向:N,E,W和S.第一次调用桶调用4个桶,但这次是方向。方向== N的函数在S方向上不着色。您可以使用0(第一次调用无方向)的整数值,方向符号最多4个。
当然,我的想法需要进一步开发以优化代码(条件应该更好地说明,因此我们不会多次访问相同的像素。)