Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 | 5 |

 

  Вопрос: Удаление дубликатов из массива Добавлено: 11.11.05 15:04  

Автор вопроса:  AsHeS | ICQ: 229759992 

Ответить

  Ответы Всего ответов: 66  

Номер ответа: 61
Автор ответа:
 AsHeS



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #61 Добавлено: 25.11.05 15:38
Хи-Хи :) Я разобрался . Как выяснилось в другом модуле у меня err был объявлен как boolean

Ответить

Номер ответа: 62
Автор ответа:
 AsHeS



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #62 Добавлено: 25.11.05 16:31
Ай-Ай :(
Фокус в том , что если в массиве встречается только 1 элемент (т.е в отличии от других он не повторяется) , то при использовании такой функции :
i = 0
Do Until Arr.MyArray(i) = ""
st = st + "<tr><td>" + Get_A_href(Arr.MyArray(i), 2) + "</td></tr>" + vbCrLf
i = i + 1
Loop
fileSt = ListPageStart.Text + vbCrLf + st + vbCrLf + ListPageEnd.Text

... на Do Until Arr.MyArray(i) = "" указывает ошибка
Run-Time error '9'
Subscript out of range
В чем же может быть дело ?

Ответить

Номер ответа: 63
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #63 Добавлено: 25.11.05 17:30
Я ж тебе не зря говорил о Text, list :))) Точно так же err - это стандартный объект VB, а ты переменную так обозвал, вот и наступил на граблю.

Run-Time error '9'
Ты же в цикле Do Until не проверяешь, вылез за пределы массива или нет, просто напропалую увеличиваешь индекс. И когда индекс становится больше, чем размер массива, происходит обращение к несуществующему элементу. Возьми за правило использовать lBound и uBound - нижнюю и верхнюю границу массива, а не хранить размеры в переменных.

Dim i as Long
For i = lBound(Arr.MyArray()) To uBound(Arr.MyArray())
    If Arr.MyArray(i) <>"" Then
        'тут твои действия
    End If
Next i


Такой цикл не выскочит за пределы массива и не вызовет Run-Time error '9'

Ответить

Номер ответа: 64
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #64 Добавлено: 25.11.05 17:36
Или если тебе надо не весь массив просмотреть, то модифицируй свой цикл с Do Until таким образом, чтобы перед обращением к к элементу массива ты был уверен, что не промахнулся мимо массива:

i = 0
Do Until Arr.MyArray(i) = ""
    st = st + "<tr><td>" + Get_A_href(Arr.MyArray(i), 2) + "</td></tr>" + vbCrLf
    i = i + 1
    'проверка на выход за предел массива
    If i > uBound(Arr.MyArray()) Then Exit Do
Loop
fileSt = ListPageStart.Text + vbCrLf + st + vbCrLf + ListPageEnd.Text

Ответить

Номер ответа: 65
Автор ответа:
 AsHeS



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #65 Добавлено: 25.11.05 18:50
Ну я не в курсе обо всех стандартных объектах VB :) На будущее учту

Ответить

Номер ответа: 66
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #66
Добавлено: 26.11.05 00:40
Имхо, Ubound за правило - это перебор. Слишком часто это неоправданно дорого - особенно в циклах do while, которые только и делают что ищут какую-нить хрень в массиве. Ubound в таких циклах может быть более-менее применим, если есть уверенность изменения размерности в каждом проходе.
Лично для меня объявления типа:
dim arrList() as AnyType,szList as Long
стали стандартом.
Просто надо об этом помнить, а привыкнуть - очень быстро.

Ответить

Страница: 1 | 2 | 3 | 4 | 5 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам