+ -
当前位置:首页 → 问答吧 → 调用递归导致运行错误,求助

调用递归导致运行错误,求助

时间:2011-12-11

来源:互联网

这是一个MFC单文档的程序,VC++6.0。现在有一个填充8位黑白图像的功能(图像里只有黑色的底色和白色的边框),我的思路是从(0,0)开始,对每个点的上下左右四个点进行判断,如果是黑色就涂成灰色,如果是白色就不操作。使用递归来做。以下是部分代码。
C/C++ code
void CSn1025Doc::FillWithWater(int i, int j,int **Image)
{
    Image[i][j]=100;    
    if( (i-1)>=0 )//向下
        if( Image[i-1][j]==0 )
            FillWithWater(i-1,j,Image);
    if( (j-1)>=0 )//向左
        if( Image[i][j-1]==0 )
            FillWithWater(i,j-1,Image);
    if( (j+1)<Width )//向右
        if( Image[i][j+1]==0 )
            FillWithWater(i,j+1,Image);
    if( (i+1)<Height )//向上
        if( Image[i+1][j]==0 )
            FillWithWater(i+1,j,Image);
}

其中Image是一个指向记录画板内容的二维指针,Width和Height是图像尺寸。
现在问题是,该程序通过编译后,在运行中会出错,提示是程序已停止工作等等等等。
另外,在四组处理中(向下,向左,向右,向上),我任意注释掉一组,例如
C/C++ code
/*if( (i-1)>=0 )//向下
        if( Image[i-1][j]==0 )
            FillWithWater(i-1,j,Image);*/
    if( (j-1)>=0 )//向左
        if( Image[i][j-1]==0 )
            FillWithWater(i,j-1,Image);
    if( (j+1)<Width )//向右
        if( Image[i][j+1]==0 )
            FillWithWater(i,j+1,Image);
    if( (i+1)<Height )//向上
        if( Image[i+1][j]==0 )
            FillWithWater(i+1,j,Image);


程序都能正常运行完毕,只是功能不完善。
请问这是什么原因?是递归调用深度过大了吗?我用的实验图像是356*200的8位bmp。求助,谢谢!

作者: snisn   发布时间: 2011-12-11

肯定是递归太深了
如果注释掉一个方向即可,那么增大栈1倍应该就够了

vc默认是1M

#pragma comment(linker,"/stack:0x200000")//这样设置为2M,如果还不够,继续增加
或者10进制写法
#pragma comment(linker,"/stack:2*1024*1024")
或者
工程属性里设置,msdn里搜索/STACK

另外,像这种问题,还是应该避免用递归,搜索非递归填充算法

作者: yisikaipu   发布时间: 2011-12-11