Раздвинуть массив

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Раздвинуть массив

Сообщение Inferno » 17.03.2005 (Чт) 22:16

Код: Выделить всё
'
.....

Private Element() as long
.....

Public Function Add(ByVal InsertValue As Long, Optional Index = -1) As Boolean
'массив пуст
If UBound(Element) = 0 Then
   ReDim Element(1)
   Element(0) = InsertValue
   Add = True
   Exit Function
End If


'добавление в конец
If Index < 0 Or Index >= UBound(Element) Then
   HmemLow = LocalAlloc(LMEM_ZEROINIT, UBound(Element) * 4)
   CopyMemory HmemLow, Element(0), UBound(Element) * 4
   ReDim Element(UBound(Element) + 1)
   CopyMemory Element(0), HmemLow, (UBound(Element) - 1) * 4
   Element(UBound(Element) - 1) = InsertValue
   LocalFree (HmemLow)
   Add = True
   Exit Function
End If
........

end function



Добавление в массив 3 элементов просходит безболезненно, на 4 выбивает вб. Подскажите что я делаю не так?

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Раздвинуть массив

Сообщение codemaster » 18.03.2005 (Пт) 0:48

[quote="Inferno"]
Код: Выделить всё
'
'массив пуст
If UBound(Element) = 0 Then
   ReDim Element(1)


1. Дорога в никуда - 100% ошибка


2. проще пользовать ReDim Preserve Element(n)
//<-
Mit freundlichen Grüßen
//->

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Re: Раздвинуть массив

Сообщение Inferno » 18.03.2005 (Пт) 1:55

codemaster писал(а):
1. Дорога в никуда - 100% ошибка
2. проще пользовать ReDim Preserve Element(n)


Перый пункт нопонятен, почему ошибка если массив еще не инициализирован?

За ReDim Preserve- спасибо.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.03.2005 (Пт) 5:40

Потому что если массив не инициализирован, ubound на нём вызовет исключение out of bounds.

Коллекцию тебе не проще будет использовать? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 18.03.2005 (Пт) 10:13

Не знаю про какие исключения вы говорите, но у меня работает :)
Ну раз говорите что ошибка, значит заведу еще одну переменную
Проще, но у же не интересно :roll:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.03.2005 (Пт) 10:42

Inferno писал(а):Не знаю про какие исключения вы говорите, но у меня работает :)


Значит у тебя где-то перед этим кодом On Error Resume Next стоит. Закоментируй ее и увидишь ошибку.

Inferno писал(а):Ну раз говорите что ошибка, значит заведу еще одну переменную
Проще, но у же не интересно :roll:


Так можно определить в любом случае, без натыкания на ошибку:

Код: Выделить всё
Public Function UboundArray(ArrayName As Variant, Optional Dimension As Integer = 1) As Long
    If Dimension < 1 Or Dimension > GetArrayDimensions(ArrayName) Then
        UboundArray = -1
    Else
        UboundArray = UBound(ArrayName, Dimension)
    End If
End Function

Public Function GetArrayDimensions(arr As Variant) As Integer
    Dim a As Long

    CopyMemory a, ByVal VarPtr(arr) + 8, 4
    CopyMemory a, ByVal a, 4
    If a Then CopyMemory GetArrayDimensions, ByVal a, 2
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 18.03.2005 (Пт) 12:24

Andrey Fedorov писал(а):Значит у тебя где-то перед этим кодом On Error Resume Next стоит. Закоментируй ее и увидишь ошибку.


Странно - нет у меня перехвата ошибок и тем не менее работает корректно.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.03.2005 (Пт) 13:12

Inferno писал(а):Странно - нет у меня перехвата ошибок и тем не менее работает корректно.


Значит массив уже инициализирован
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 20.03.2005 (Вс) 11:38

Вот что значит одну строчку не дописать.
В конструкторе есть строка
Redim Element(0)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 13

    TopList