Индекс вне пределов, несмотря на то, что выше, чем lbound, и ниже, чем ubound - PullRequest
0 голосов
/ 27 сентября 2019

Я скопировал приведенную ниже реализацию быстрой сортировки из Wikibooks (Автор: Джон Грин).Я добавил Маленькая обертка, чтобы проверить это.Однако выполнение завершается неудачно с ошибкой индекса вне привязки, которая, кажется, не имеет смысла.

Прямой ввод Показывает в точке останова следующий правильный вывод:

?UBound(VA_array)
 7 
?V_Low1
 1 
?V_High1
 7 

?(V_Low1 + V_High1) / 2
 4 
?dbgEchoVarType(VarType(VA_array))
vbArray: Array of type vbVariant: (used only with array of variants)

Последний являетсяпросто функция, чтобы превратить VarType в строку.Тип выглядит нормально.

Public Sub sortThis()
    Dim r() As Variant
    r = Selection.Value2
    Debug.Print ("Selected Range: " & getRngAddress(Selection))
    Call QuickSort(r)
    Selection.Value2 = r
End Sub

Sub QuickSort(ByRef VA_array(), Optional V_Low1, Optional V_High1)
    Dim V_Low2 As Long, V_High2 As Long
    Dim V_val1 As Variant, V_val2 As Variant
    If IsMissing(V_Low1) Then V_Low1 = LBound(VA_array, 1)
    If IsMissing(V_High1) Then V_High1 = UBound(VA_array, 1)
    Debug.Print ("qs: Low1: " & V_Low1 & " / V_High1: " & V_High1)
    V_Low2 = V_Low1
    V_High2 = V_High1
    V_val1 = VA_array((V_Low1 + V_High1) / 2)
    While (V_Low2 <= V_High2)
        While (VA_array(V_Low2) < V_val1 And V_Low2 < V_High1)
            V_Low2 = V_Low2 + 1
        Wend
        While (VA_array(V_High2) > V_val1 And V_High2 > V_Low1)
            V_High2 = V_High2 - 1
        Wend
        If (V_Low2 <= V_High2) Then
            V_val2 = VA_array(V_Low2)
            VA_array(V_Low2) = VA_array(V_High2)
            VA_array(V_High2) = V_val2
            V_Low2 = V_Low2 + 1
            V_High2 = V_High2 - 1
        End If
    Wend
    If (V_High2 > V_Low1) Then Call QuickSort(VA_array, V_Low1, V_High2)
    If (V_Low2 < V_High1) Then Call QuickSort(VA_array, V_Low2, V_High1)
End Sub


Выделение содержит 7 ячеек в одном столбце, каждый из которых содержит постоянное целочисленное значение.

Я не понимаю, почему 4 считается индексом вне границы.Отладочное сообщение в приведенном выше коде показывает, что код не выполняется при первом вызове, а не при любых последующих вызовах.

Что не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...