调用递归导致运行错误,求助
时间:2011-12-11
来源:互联网
这是一个MFC单文档的程序,VC++6.0。现在有一个填充8位黑白图像的功能(图像里只有黑色的底色和白色的边框),我的思路是从(0,0)开始,对每个点的上下左右四个点进行判断,如果是黑色就涂成灰色,如果是白色就不操作。使用递归来做。以下是部分代码。
C/C++ code
其中Image是一个指向记录画板内容的二维指针,Width和Height是图像尺寸。
现在问题是,该程序通过编译后,在运行中会出错,提示是程序已停止工作等等等等。
另外,在四组处理中(向下,向左,向右,向上),我任意注释掉一组,例如
C/C++ code
程序都能正常运行完毕,只是功能不完善。
请问这是什么原因?是递归调用深度过大了吗?我用的实验图像是356*200的8位bmp。求助,谢谢!
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
另外,像这种问题,还是应该避免用递归,搜索非递归填充算法
如果注释掉一个方向即可,那么增大栈1倍应该就够了
vc默认是1M
#pragma comment(linker,"/stack:0x200000")//这样设置为2M,如果还不够,继续增加
或者10进制写法
#pragma comment(linker,"/stack:2*1024*1024")
或者
工程属性里设置,msdn里搜索/STACK
另外,像这种问题,还是应该避免用递归,搜索非递归填充算法
作者: yisikaipu 发布时间: 2011-12-11
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28