vc调试时出现“stack overflow"与”Access Violation"异常

kunlunshanjiao 2009-04-22 02:05:54
int CMainFrame::ErasionFalseArea()
{
int PixelNum[255];//记录连续区域的白色像素点个数
int i,j;
long Offset;
unsigned char * lpb;
lpb=m_ycc_buffer;
LPBITMAPINFOHEADER lpbi;
lpbi=&m_bitmapheader;
//lpbi_ycc是指向"存放'以YCrCb色彩空间表达的数据信息'的信息头信息"的指针;
DWORD wBytesPerLine=BytePerLine(lpbi);//得到每行像素所占用的字节数;
for(i=0;i<255;i++)
{ PixelNum[i]=0; }

int calNum=0;//连续区域的个数;

for(i=0;i<(lpbi->biHeight);i++)
for(j=0;j<(lpbi->biWidth);j++)
{
Offset=PixelOffset(i,j,wBytesPerLine);
if((*(lpb+Offset)==255)&&(*(lpb+Offset+1)==255)&&(*(lpb+Offset+2)==255))//如果当前点的像素颜色是白色,则递归统计该区域内连续白色像素点的个数;
{
calNum++;
RecursiveCal(lpb,i,j,wBytesPerLine,&(PixelNum[calNum]),calNum);
//采集到的人脸面积过大,
//程序在递归的过程中会造成系统stack溢出,
//应如何解决???

}
}}
void CMainFrame::RecursiveCal(unsigned char * lpData,int y,int x,DWORD wBytesPerLine,int * pixelNum,int num)
{ LPBITMAPINFOHEADER lpbi;
lpbi=&m_bitmapheader;
long Offset=PixelOffset(y,x,wBytesPerLine);
//如果当前点为白色点;
if((*(lpData+Offset)==255)&&(*(lpData+Offset+1)==255)&&(*(lpData+Offset+2)==255))
{
//把当前点大小设置为序号值;
*(lpData+Offset++)=num;
*(lpData+Offset++)=num;
*(lpData+Offset++)=num;
//像素个数加1
(*pixelNum)++;
int tempx;
int tempy;
//递归当前点下面的点;
tempy=y-1;
tempx=x;
if((y-1)>=0)
RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);

//递归当前点上面的点;
tempy=y+1;
tempx=x;
if((y+1)<=lpbi->biHeight)
RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);

//递归当前点左边的点;
tempy=y;
tempx=x-1;
if((x-1)>=0)
RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);

//递归当前点右边的点;
tempy=y;
tempx=x+1;
if((x+1)<=lpbi->biWidth)
RecursiveCal(lpData,tempy,tempx,wBytesPerLine,pixelNum,num);
}
}
...全文
443 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kunlunshanjiao 2009-05-10
  • 打赏
  • 举报
回复
谢谢上面各位大虾的帮助,本人刚进入此论坛不久,以后还求多多帮助
wjf8882300 2009-04-27
  • 打赏
  • 举报
回复
递归导致的堆栈溢出,必须设置一个边界点,一般情况下是图像过大造成的,可以设置图片大小或者设置递归深度
  • 打赏
  • 举报
回复
for(j=0;j <(lpbi->biWidth);j++)
{
Offset=PixelOffset(i,j,wBytesPerLine);
if((*(lpb+Offset)==255)&&(*(lpb+Offset+1)==255)&&(*(lpb+Offset+2)==255))//如果当前点的像素颜色是白色,则递归统计该区域内连续白色像素点的个数;
{
calNum++;
RecursiveCal(lpb,i,j,wBytesPerLine,&(PixelNum[calNum]),calNum);
//采集到的人脸面积过大,
//程序在递归的过程中会造成系统stack溢出,
//应如何解决???

}
}}

你试着把VC的单个进程的栈大小设置大点,要是还不行,就只能改算法了。
youwill 2009-04-24
  • 打赏
  • 举报
回复
你可以先试着加大stack的容量。
fire_woods 2009-04-22
  • 打赏
  • 举报
回复
堆栈实现递归,你可以到网上搜搜相关的介绍.

要点就是,
1. 搞清楚递归函数中那些变量是需要保存的,为这些变量建立一个统一的结构体,作为堆栈的单元.
2. 调用递归函数,就是把当前函数的临时数据压栈,然后处理新的数据.
3. 当递归函数返回时,就出栈,并更新数据.

好像说的不是很明白,将就着看吧.其实编译后的汇编代码,也是用栈来实现递归的,实现过程差不多就是上面写的.
fire_woods 2009-04-22
  • 打赏
  • 举报
回复
递归会导致栈溢出的,首先你check你的递归是不是有出口,有停止条件
然后check递归会被调用多少次,也就是深度和广度,这个会影响栈的大小.

如果次数实在太多,还是用堆栈来实现递归吧.

4,506

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧