0

我需要帮助..我正在制作一个模仿油漆桶的功能..当一半的图像被着色时,问题就出现了这个错误发生“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 上使用

4

2 回答 2

1

我猜美元是甜甜圈,你正在炸毁你的筹码。NTVM 是 Windows 的 dos 模拟器。我猜它的堆栈有限。尝试寻址堆栈之外的内存(可寻址范围)会导致非法指令。这也可以解释为什么您只能为大图片获取它。

于 2012-07-02T17:54:25.900 回答
1

在您运行的代码中,递归永远不会结束......当存储桶到达图像的边界(顶部、底部、左侧或右侧)时,您应该停止递归。

还有一个问题:每次调用函数都会调用另外四个函数。这意味着即使您为图像边框添加特殊 if ,递归也永远不会结束,因为例如像素上的桶 (x,y) 调用桶 (x+1,y) 和像素上的桶 (x+1,y) 调用桶(x-1,y) 实际上又是像素 (x,y)!

我对你的建议是添加特殊的函数参数,如 ,,direction''。考虑四个方向:N、E、W 和 S。第一次调用存储桶调用 4 个存储桶,但这次有方向。方向==N 的函数不会在 S 方向上着色。您可以使用从 0(第一次调用时无方向)到 4 的整数值作为方向符号。

当然,我的想法需要进一步开发来优化代码(条件应该更好地说明,这样我们就不会多次访问相同的像素)。

于 2012-07-02T21:24:57.613 回答