大家帮我看看下面的代码有没有问题

syl19841029 2008-03-26 02:23:45
// 是否为重复设备
DWORD ip = pdfInfo->ip;
int iItem = FindDeviceItem(ip); //判断设备信息的IP是否在列表控件中
if(iItem!=-1) // 已存在于设备列表中
{
// 替换并删除旧的记录
m_lstDevice.DeleteItem(iItem);//m_lstDevice是个列表控件的关联变量

// 从设备信息数组中删除
//DevArray是一个CPtrArray,里面存储了DeviceFindInfo(一个结构体)型指针
//我是这样存储的,DeviceFindInfo DevInfo;DevArray.Add(&DeInfo);
for(int i=0;i<DevArray.GetSize();i++)
{

DeviceFindInfo *pdoldInfo;
pdoldInfo=(DeviceFindInfo*)DevArray.GetAt(i);
if(pdoldInfo->ip==ip)
{

DevArray.RemoveAt(i);
pdoldInfo=NULL;
break;
}
}
}
老是出错,不知道有什么隐患,谢谢高手指点
...全文
39 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
syl19841029 2008-03-26
  • 打赏
  • 举报
回复
感谢楼上,这个问题疏忽了!!都是高手啊!!
Eleven 2008-03-26
  • 打赏
  • 举报
回复
for(int i=0;i <DevArray.GetSize();i++)
{

DeviceFindInfo *pdoldInfo;
pdoldInfo=(DeviceFindInfo*)DevArray.GetAt(i);
if(pdoldInfo->ip==ip)
{

DevArray.RemoveAt(i);
pdoldInfo=NULL;
break;
}
}
}
这个循环有问题,DevArray.RemoveAt(i); 以后,DevArray.GetSize()的长度是减小了,因为你在for()语句是用的是这个,它不会报错,RemoveAt(i)以后,i后面的要向前移动,所以下一个循环,再RemoveAt(i)就会带来问题了,我个人认为的话,最好是从后向前删除,用while()
int len=DevArray.GetSize();
while((len--)>=0)
{
。。。
DevArray.RemoveAt(len);
。。。。
}

smu316 2008-03-26
  • 打赏
  • 举报
回复
o !!!!!!!!!!!!!!!!!!!!!!
syl19841029 2008-03-26
  • 打赏
  • 举报
回复
但是DevArray是一个CPtrArray型,而FindIndex是CObList型的成员函数
hhuc2001 2008-03-26
  • 打赏
  • 举报
回复
POSITION pos = DevArray.FindIndex(i);
pdoldInfo=(DeviceFindInfo*)DevArray.GetAt(pos);
if(pdoldInfo->ip==ip)
{

DevArray.RemoveAt(pos);
delete pdoldInfo;
break;
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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