vb程序调试
程序调试
假设我们要开发这样的一个排序程序:首先要求用户在Text1中输入一整数,点击“添加”按钮后将该整数添加到“初始序列”List1中,如此多次后,再点击“排序”按钮,在List2中显示排序结果,我们期望的运行结果如图6,3所示。
图6,3 期望的程序运行结果
要求:
(1)按图6,4进行界面设计
图6,4 排序程序的界面设计
(2)根据如下所给程序代码进行程序调试
Private Sub Command1_Click()
List1.AddItem Text.Text
End Sub
排序按钮的Click事件
Private Sub Command2_Click()
Dim i, j As Integer
'定义数组,以List1的项目个数为数组维数
Dim strList(List1.ListCount) As Integer
'定义中间临时变量,用于数据交换
Dim strTmp As Integer
'将List1中的项目导入到strList数组中
For i = 0 To List1.ListCount
strList(i) = List1.List(i)
Next i
'按“冒泡”算法完成排序工作
For i = 0 To UBound(strList)
For j = i + 1 To UBound(strList)
If strList(i) > strList(j) Then
strTmp = strList(i)
strList(i) = strList(j)
strList(j) = strTmp
End If
Next j
Next i
'将排序结果输出到List2中
For i = 0 To UBound(strList)
List2.AddItem strList(i)
Next i
End Sub
(3)运行程序,在Text1文本框中输入一个整数,比如1,然后点击“添加”按钮,
此时会出现如图6,5所示的错误提示。
图6,5 实时错误
(4)点击“调试”按钮,进入中断模式,VB编译器将自动标识出引发错误的语句行,
如图6,6所示窗体。
图6,6 自动定位引发错误的语句行
(5)分析错误原因,很容易发现该行语句的正确写法应该是:
List1.AddItem Text1.Text (6)修改错误后,按F5键继续执行程序,将出现如图6,7所示界面。
图6,7排序程序运行界面
(5)在上述界面上依次输入以下整数序列“21,9,8,6”后,将出现如图6,8所示界面。
图6,8 输入初始序列后的界面 (6)点击“排序”按钮后,又出现如图6,9所示的运行错误。
图6,9 编译错误
(7)点击“确定”按钮后,再次进入中断模式,编译器以加重的形式指出了引发错误
的位置,如图6,10所示。
引发错误的位置
图6,10 以加重显示的方式定位错误
(8)分析图6,9所示的错误提示“要求常数表达式”后,发现引用错误的原因是不能
用变量作为数组的下标,即下列数组声明语句不符合VB语法约定:
Dim strList(List1.ListCount) As Integer 为此我们做如下选择,即采用动态数组声明的
Dim strList() As Integer
ReDim strList(List1.ListCount) As Integer (9)选择完成后,按F5键继续执行,又会出现如图6,11所示的错误提示。
图6,11类型不匹配错误提示
(10)点击“调试”按钮后,错误定位如图6,12所示。
图6,12 类型不匹配错误定位
(11)分析错误原因发现,我们将数组strList()声明为Integer数据类型,而List1.List()表示的是字符型数据,VB无法进行自动类型转换,因此我们只能通过Val函数进行转换:
strList(i) = Val(List1.List(i))
(12)按F5键继续,程序成功运行,出现如图6,11所示界面。这说明语法错误已基本排除了。但是观查运行结果,发现“排序结果”序列中多出了一个数值0。这种结果并不是我们期望的。
图6,11 有问题的运行结果
(13)关闭程序,重新运行,仍然出现图6,11的问题,这说明程序中存在逻辑问题,需要进一步调试。
(14)设置断点,分析逻辑错误。用鼠标点击如图6,12所示位置设置断点
图6,12 设置断点
(15)按F5键运行程序并输入一组整数,比如“5,4,3,2”。点击“排序”按钮后,程序将进入中断模式,出现如图6,13所示界面。
程序在此处中断
图6,13 程序遇到断点
(16)在VB集成环境的“立即”窗口中,使用“,”打印strList数组的上界和相关的值,如图6,14所示。当然也可以使用Print、Debug.Print命令,它们等效于,。
图6,14 在“立即”窗中观查变量的值
(17)仔细分析不难发现,List1.ListCount的最大值是4,说明数字序列中共有4个
数,即“5,4,3,2”。但是List1.List()的下标是从0开始的,下标最大值应该为3,即: List1.ListCount – 1
为些,我们需要选择strList()数组的上界和循环次数。
'个性数组声明
ReDim strList(List1.ListCount - 1) As Integer
'修改循环次数
For i = 0 To List1.ListCount - 1
strList(i) = Val(List1.List(i))
Next i
(18)修改后的完整代码及运行结果如图6,15、图6,16所示。
图6,15 修改后的代码
图6,16 最终的运行结果
注意:提交“vbxk6,程序调试”文件夹。