是不是效率太低了啊??? 急急急急急!!谢谢 和m_step值的大小没有关系, 看看你的这句代码:CPoint m_pixel_linked_bp = new CPoint[m_step]; 连个指针符号都没有,有这么定义指针的吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CPoint m_pixel_linked_bp = new CPoint[m_step];CPoint 是MFC的CPoint?CPoint m_pixel_linked_bp 这不代表指针呀,还是你写错了 new CPoint[m_step];另外你new了之后,在哪里delete?程序执行后必然内存漏洞一大堆。 CPoint m_pixel_linked_bp = new CPoint[m_step];==============CPoint m_pixel_linked_bp[m_step]; CPoint m_pixel_linked_bp = new CPoint[m_step];不好意思啊 。我复制程序时漏了。应该是CPoint *m_pixel_linked_bp;m_pixel_linked_bp = new CPoint[m_step];接受plane1980(fy)的建议,可能是内存泄露了。我改改。另外问下,如果正常情况下,执行这种复杂度的饿代码应该不会导致卡机吧。谢谢大家的意见。 我还想补充的是,m_pixel_linked_bp数组在该函数调用完了后还要用啊。另外我是把它定义成了全局数组(这里为方便看才写在函数Getlinkednode()里面的)。所以我觉得这里有必要用DELETE来释放内存么。还有就是即使是没有释放内存情况下,会导致我所出现的问题么?对于m_step较小的时候运行正常。若m_step大(100甚至几千)的时候通过单步运行也不会出现一下子就弹出那样的提示然后就自动关闭。还望大家多多指教。谢谢。注:CPoint是MFC的类。CPoint m_Dir[8];//表示某象素点的八邻域m_Dir[0].x= 0; m_Dir[0].y=-1; //为左m_Dir[1].x=-1; m_Dir[1].y=-1; //为左上m_Dir[2].x=-1; m_Dir[2].y= 0; //为上m_Dir[3].x=-1; m_Dir[3].y= 1; //为右上m_Dir[4].x= 0; m_Dir[4].y= 1; //为右m_Dir[5].x= 1; m_Dir[5].y= 1; //为右下m_Dir[6].x= 1; m_Dir[6].y= 0; //为下m_Dir[7].x= 1; m_Dir[7].y=-1; //为左下函数主要作用或者说算法给大家讲下。m_step是某个连通图象(比如说一个矩形区域)的边界点的个数。我的目的是将这些边界点(象素点)用m_pixel_linked_bp[m_step]来保存起来。但是有个前提是必须按照瞬时针方向将边界点存储起来的。所以在存储过程中(Getlinkednode()中的for(i=0;i<m_step;i++){}循环)调用了Getnextnode()函数来求得当前点的下一个点。direction是我用来定义象素点八个邻域与该点的相对位置的,对应于m_Dir[8]的八个方向。请大家看看。谢谢 程序再发一遍:先前的没对齐啊。void Getlinkednode(){ int direction=-1 int m_step=100; CPoint BP;///初始节点,已知 BP.x=1;//假设(1,1)为边界上的的点 BP.y=1; CPoint *m_pixel_linked_bp = new CPoint[m_step]; CPoint nextnode; for(i=0;i<m_step;i++) { if(i==0){////边界点的起始位置为BP[0] m_pixel_linked_bp[0].x=BP.x; m_pixel_linked_bp[0].y=BP.y; direction=0; continue; } direction=Getnextnode(nextnode,m_pixel_linked_bp[i-1],direction); m_pixel_linked_bp[i].x=nextnode.x; m_pixel_linked_bp[i].y=nextnode.y; } return ; }/////返回方向directionint Getnextnode(CPoint &nextnode, CPoint &curnode,int direction){ //////初始化,可有可无 nextnode.x=0; nextnode.y=0; int flag_new;//新的方向,用于保留当前进入当前的的方向(为左、左上等等) int x_cur; int y_cur; x_cur=curnode.x; y_cur=curnode.y; //某个方向上面的临时x,y坐标 int x_temp; int y_temp; ////////以x_cur、y_cur为中心找到该点的上一个节点。 for(int flag=direction+1; flag<direction+8; flag++) { flag_new=flag%8; x_temp=m_Dir[flag_new].x + x_cur; y_temp=m_Dir[flag_new].y + y_cur; //判断x_temp,y_temp是否越界 if(x_temp<0 || x_temp>x || y_temp<0 || y_temp>y) { continue;//越界,计算下一个方向 } if(1 == m_pixel_wholeimg[x_temp][y_temp]){ //////////保存当前点做作为curnode的nextnode nextnode.x=x_temp; nextnode.y=y_temp; ///////////当前方向上的点为目标点,修改direction作为下次调用的参数 switch(flag_new){ case 0: flag_new=4; break; case 1: flag_new=5; break; case 2: flag_new=6; break; case 3: flag_new=7; break; case 4: flag_new=0; break; case 5: flag_new=1; break; case 6: flag_new=2; break; case 7: flag_new=3; break; default: break; } break;//不要再判断了,因为已经找了nextnode } } return flag_new;} 可以利用八方向Freeman连码来存储这些边界点(象素点),只要记录起始点坐标和Freeman连码数组就行了. 双缓冲DC贴图 初级学习mfc都要看哪些书?? 请问如何在VC中实现透明flash? 如何获得控件ID? 请求在文件中匹配所有的字符串的正则表达式!!!!!! 请问用什么函数画一个空心的圆圈 在线等待!!!!在sybase存储过程中怎样取一个有符号int型的前三位作为char型输出????? 键盘响应被隐藏了怎么办? VS2010读文件中的问题 有关UNICODE。 关于切线空间的问题,高手进 VC报错,每个对话框都一样的错误。帮帮忙(急!!!在线等)
另外你new了之后,在哪里delete?程序执行后必然内存漏洞一大堆。
==============
CPoint m_pixel_linked_bp[m_step];
应该是
CPoint *m_pixel_linked_bp;
m_pixel_linked_bp = new CPoint[m_step];
接受plane1980(fy)的建议,可能是内存泄露了。我改改。另外问下,如果正常情况下,执行这种复杂度的饿代码应该不会导致卡机吧。谢谢大家的意见。
CPoint是MFC的类。
CPoint m_Dir[8];//表示某象素点的八邻域
m_Dir[0].x= 0; m_Dir[0].y=-1; //为左
m_Dir[1].x=-1; m_Dir[1].y=-1; //为左上
m_Dir[2].x=-1; m_Dir[2].y= 0; //为上
m_Dir[3].x=-1; m_Dir[3].y= 1; //为右上
m_Dir[4].x= 0; m_Dir[4].y= 1; //为右
m_Dir[5].x= 1; m_Dir[5].y= 1; //为右下
m_Dir[6].x= 1; m_Dir[6].y= 0; //为下
m_Dir[7].x= 1; m_Dir[7].y=-1; //为左下
函数主要作用或者说算法给大家讲下。m_step是某个连通图象(比如说一个矩形区域)的边界点的个数。我的目的是将这些边界点(象素点)用m_pixel_linked_bp[m_step]来保存起来。但是有个前提是必须按照瞬时针方向将边界点存储起来的。所以在存储过程中(Getlinkednode()中的for(i=0;i<m_step;i++){}循环)调用了Getnextnode()函数来求得当前点的下一个点。direction是我用来定义象素点八个邻域与该点的相对位置的,对应于m_Dir[8]的八个方向。请大家看看。谢谢
void Getlinkednode(){
int direction=-1
int m_step=100; CPoint BP;///初始节点,已知
BP.x=1;//假设(1,1)为边界上的的点
BP.y=1;
CPoint *m_pixel_linked_bp = new CPoint[m_step];
CPoint nextnode; for(i=0;i<m_step;i++)
{
if(i==0){////边界点的起始位置为BP[0]
m_pixel_linked_bp[0].x=BP.x;
m_pixel_linked_bp[0].y=BP.y;
direction=0;
continue;
}
direction=Getnextnode(nextnode,m_pixel_linked_bp[i-1],direction);
m_pixel_linked_bp[i].x=nextnode.x;
m_pixel_linked_bp[i].y=nextnode.y;
} return ;
}/////返回方向direction
int Getnextnode(CPoint &nextnode, CPoint &curnode,int direction)
{
//////初始化,可有可无
nextnode.x=0;
nextnode.y=0; int flag_new;//新的方向,用于保留当前进入当前的的方向(为左、左上等等)
int x_cur;
int y_cur;
x_cur=curnode.x;
y_cur=curnode.y; //某个方向上面的临时x,y坐标
int x_temp;
int y_temp; ////////以x_cur、y_cur为中心找到该点的上一个节点。
for(int flag=direction+1; flag<direction+8; flag++)
{
flag_new=flag%8;
x_temp=m_Dir[flag_new].x + x_cur;
y_temp=m_Dir[flag_new].y + y_cur;
//判断x_temp,y_temp是否越界
if(x_temp<0 || x_temp>x || y_temp<0 || y_temp>y)
{
continue;//越界,计算下一个方向
}
if(1 == m_pixel_wholeimg[x_temp][y_temp]){
//////////保存当前点做作为curnode的nextnode
nextnode.x=x_temp;
nextnode.y=y_temp; ///////////当前方向上的点为目标点,修改direction作为下次调用的参数
switch(flag_new){
case 0:
flag_new=4;
break;
case 1:
flag_new=5;
break;
case 2:
flag_new=6;
break;
case 3:
flag_new=7;
break;
case 4:
flag_new=0;
break;
case 5:
flag_new=1;
break;
case 6:
flag_new=2;
break;
case 7:
flag_new=3;
break;
default:
break;
}
break;//不要再判断了,因为已经找了nextnode
}
}
return flag_new;
}