首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么堆栈在这段代码中会被溢出?

为什么堆栈在这段代码中会被溢出?
EN

Stack Overflow用户
提问于 2009-05-24 12:12:10
回答 7查看 550关注 0票数 0

我编写了这个函数来填充闭环,像素是全局声明的,以存储像素的颜色值,第一次单击将在其中完成(在闭环中)。

但问题是,当第一个*填充(.,.)*结束时,这个递归并没有终止,它说堆栈溢出了……

代码语言:javascript
复制
void fill(int x,int y)
{
    GLfloat pixval[3];
    glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,pixval);
    if(pixval[0]==pixvali[0] && pixval[1]==pixvali[1] && pixval[2]== pixvali[2])
    {
        glBegin(GL_POINTS);
            glVertex2i(x,y);
        glEnd();
        glFlush();
        fill(x-1,y);
        fill(x+1,y);
        fill(x,y-1);
        fill(x,y+1);
    }   
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-05-24 12:47:39

实现您自己的堆栈,不要使用递归来填充洪水,除非您正在用相对较小的象素填充形状。

一个典型的实现是:

代码语言:javascript
复制
Stack stack; 
stack.push(firstPoint);

while(!stack.isEmpty()){
   Point currentPoint= stack.pop();
   //do what ever you want to do here, namely paint.
   //boundary check ur surrounding points and push them in the stack if they are inbounds
}
票数 0
EN

Stack Overflow用户

发布于 2009-05-24 12:21:58

堆栈溢出是因为您正在使用递归,并且递归的深度与所填充形状中的像素数成线性关系。

这也可能是,你试图填补形状相同的颜色,因为它已经是。也就是说,当前的gl颜色与像素值相同。在这种情况下,您将得到无限递归。

票数 4
EN

Stack Overflow用户

发布于 2009-05-24 12:28:44

从问题中很难分辨,但我猜,你会开始像像素一样循环。

例如,假设只有4个像素需要着色(0,0),(0,1),(1,0),(1,1)。

开始着色(0,0)。然后递归将进入(1,0),因为(-1,0)不需要着色。然后再次(0,0),因为它是像素,也就是(x-1,y),等等。

您需要添加某种方式来标记已经着色的像素。但这只是猜测,因为你不能真正看到函数之外发生了什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/903642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档