MyException - 我的异常网
当前位置:我的异常网» VB » 不甘呐,竟然被FOR循环难住了

不甘呐,竟然被FOR循环难住了

www.myexceptions.net  网友分享于:2013-04-10  浏览:6次
不甘心呐,竟然被FOR循环难住了
    Public Function strDelSameItemInArr(ByVal strArray As String()) As String()
        Dim I As Long, J As Long, K As Long, mCount As Long
        mCount = UBound(strArray)
        For I = 0 To mCount - 1
            For J = I + 1 To mCount
                If strArray(I) = strArray(J) Then
                    For K = J To mCount - 1
                        strArray(K) = strArray(K + 1)
                    Next K
                    ReDim Preserve strArray(mCount - 1)
                    mCount = mCount - 1
                    If J = mCount Then
                        Exit For
                    End If
                End If
            Next
        Next
        Return strArray
    End Function


功能是要删除数组中的重复项
Dim strArray As String() = {"start18", "start36", "start54", "start18", "start18"}


调试发现执行过一次mCount = mCount - 1后mCount=3,而再继续NEXT后J已经是4了,
但是
For J = I + 1 To mCount竟然还能执行,导致 strArray(J)下标超限

不解
FOR

------解决方案--------------------
很多人觉得VB6简单,还打比方,说VB好比公共汽车,而VB.NET好比“喷气客机”——他们根本不了解的是,喷气客机的飞行员可以在巡航的时候睡觉的哦,BUS司机一边开车一边吃泡面就被人骂了。

我们看看在VB.NET中实现你的这个需求需要几行代码:

Public Function strDelSameItemInArr(ByVal strArray As String()) As String()
    Return strArray.Distinct().ToArray()
End Function

------解决方案--------------------
“但是 For J = I + 1 To mCount 竟然还能执行,导致 strArray(J)下标超限”
  这个没什么好奇怪的,For J = I + 1 To mCount中控制变量的终值,在执行到这句时,已经由mCount的值决定了,你在后面的代码中改变mCount的值,并不会改变这个For循环的执行次数。

对于楼主的代码,简单修正如下:
'Public Function strDelSameItemInArr(ByVal strArray As String()) As String()
'原代码错误:①格式错误;②调用规范错误(数组只能ByRef)。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有