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