您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:14 来源:vckbase.com

本文章共2698字,分2页,当前第1页,快速翻页:
 

除虫随记


作者:Abbey


源代码下载:IPPortAbstractor.rar(8KB)

逆风编程精品

摘要 本文讲述了本人在编写一个IP:Port提取器过程中发现 Bug 并最终排除它们的过程,并解释了原理。

关键字 VC# 正则表达式 调试


  我最近在看正则表达式,加之本人又是一个 CSer,于是想着利用正则表达式从文件中提取 IP:Port 这样的服务器地址,于是便有了昨天写的这个项目(不要被它的项目名称迷惑,我本来要做个关机程序 Shutdown 的,后来才改做这个 IPPortAbstractor 的)。先看看它的界面吧。



接着我完成了最初的代码,在调试过程中发现了以下几个Bug:

1、ProcessMatch() 成员中:
  Bug-1:下面这样并不会引发编译错误,但是 StringBuilder 数组的数据元素需要另行 new ,因此在运行时会触发异常“源数组中至少有一个元素无法被向下转换到目标数组类型。”我想我是把 string 与 StringBuilder 看得太简单了。

textlineList.CopyTo(strArray);

正确的做法是利用循环,如下:

for (int i = 0; i< textlineList.Count;   i)

strArray[i] = new StringBuilder((string) textlineList[i]);

  Bug-2:这样也不会引发编译错误,但会触发异常“指定的转换无效。”我看上面的转换都成功了,这里为什么就不行呢?不得其解,还请各位解释一下

matches = m_regexIPPort.Matches((string)textlineList[i]);

正确的做法是利用 object.ToString() 函数,如下:

matches = m_regexIPPort.Matches(textlineList[i].ToString());

2、buttonDelete_Click() 成员中
  Bug-3:在这里,我想把用户在 Listbox 中的选中行删除,最先用的是这样的 for 循环,结果会发生无法一次性将多个选中行删除的现象

for (int i = 0; i < listboxResult.SelectedIndices.Count;   i)

{ 

	m_IPPortList.Remove(listboxResult.SelectedItems[i].ToString());

	listboxResult.Items.Remove(listboxResult.SelectedItems[i]); 

}      
  正确的做法如下,这也是我想到的最简单的办法了。 Bug 的产生原因在于 SelectedIndices.Count 在 Remove 操作后会发生变化,从而导致 i 的值发生变化,因此不能使用 for 循环。
while ((i = listboxResult.SelectedIndices.Count) > 0)

{				

	// 切记:下面两条语句顺序不能颠倒

	// listboxResult.Items.Remove 删除元素后将导致 m_IPPortList.Remove

	// 无法定位,也会触发异常“索引超出了数组界限。”

	m_IPPortList.Remove(listboxResult.SelectedItems[i-1].ToString());

	listboxResult.Items.Remove(listboxResult.SelectedItems[i-1]);				

}      
3、保存搜索结果时一系列的 Bug
  这里连续的 Bug 是项目中我最头疼的。本想在点击“退出”后弹出对话框,提示用户保存搜索结果。选择“是”进行保存,选择“否”直接退出,选择“取消”返回程序。最早 buttonExit_Click() 主要内容是这样的:
if (!IsSaved)

{

	result = MessageBox.Show("搜索结果还没有保存,是否进行保存?", "保存搜索结果",

				 MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);

	switch (result)

	{

		case DialogResult.Yes:  //要保存

			buttonSaveResult_Click(sender, e);

			Close();

			break;

							

		case DialogResult.No:  //不保存

			Close();

			break;

		

		case DialogResult.Cancel: //返回程序,暂不退出

			break;

		

		default:

			break;

	}

}       
 
本文章更多内容1 - 2 - 下一页>>
相关文章

基于 ODBC 自动存储自动定期删除数据库记录
乱砍设计模式之一:STRATEGY模式———赵子
Win32串口编程
Windows2000下的Raw TCP/IP库
模拟器和远程调试工具(一)
调试方法和技巧
遍历搜索注册表
自绘菜单的实现
系统托盘编程完全指南(二)
魔法单词记忆——DAO访问ACCESS数据库
软件框架的利器、TangramMini组件应用教程一
深入浅出ShellExecute
在List Control中实现列表项目的上下移动
常用编码详解
更新MFC中的视图,跟踪.NET Framework中的事
编程之道
修改一个完全颜色的CListCtrl类
消息值,托管字符串,扰乱代码及其它
如何让一个打开的文档成为活动文档
软件框架的利器、TangramMini组件应用教程四

相关评论


本文章所属分类:首页 VC++

  热门关键字: