Особенности динамических массивов в VB5

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

Особенности динамических массивов в VB5

Сообщение raadmin » 27.10.2006 (Пт) 18:23

Здраствуйте, господа.
Я много работаю с динамическими массивами на VB 5 и тут я сталкиваюсь с такой проблемой.
Процедура должна добавлять в массив A один элемент. Очевидное решение:

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


I = Ubound( A )
redim preserve A(i+1)


не будет работать, так как Ubound вызовет ошибку, если еще ни разу не был использован redim. Если же redim написать в Form_load, то в массиве уже будут какие-то элементы (так как невозможно указать внутри redim длину массива =0), а их быть не должно. К сожалению, динамические массивы нулевой длины почему-то в VB 5 (и 6, наверное, тоже) не поддерживаются.
Я делаю следующим образом. Оцените и скажите, правильно ли я делаю или есть способ покрасивее, получше и правильнее? Может, я что-то упустил?
МОЕ КОРЯВОЕ РЕШЕНИЕ ПОДОБНЫХ ПРОБЛЕМ:

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


Option base 1

Private Sub Form_Load()
   redim A(0 to 0)
End Sub

sub XXX
   I = Ubound( A ) + 1
   if I = 1 then redim A(i) else redim preserve A(i)
end sub



Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 27.10.2006 (Пт) 18:28

Отлавливать ошибку при попытке определения границ массива. Лучше всего вынести в отдельную процедуру.

Или вот здесь есть изящное решение проблемы
Весь мир матрица, а мы в нем потоки байтов!

raadmin
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 29.09.2006 (Пт) 18:27

Сообщение raadmin » 27.10.2006 (Пт) 18:46

Если под отлавливать ошибку понимается:

on error goto

то это никак не пойдет. Конструкция слишком неудобная. Поймите, эту проверку нужно будет делать, может быть, в 10 местах! Если я везде будет городить огород из on error, то это будет очень некрасиво. К тому же, после on error goto придется еще написать on error goto 0.

В моем же примере всё получается АВТОМАТИЧЕСКИ: например, цикл

for i = 1 to Ubound(A)

выполнится 0 раз, если функция XXX не вызывалась.
Но всё равно, мой вариант - это скорее вынужденная мера. Я не могу назвать его красивым или удобным. Может ли кто-нибудь посоветовать что-нибудь по-лучше? И когда, в конце-концов, появится поддержка массивов с нулевой длиной?

Кстати, это к слову о выборе языка. Вот она, корявость VB во всей красе!

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

Сообщение GSerg » 28.10.2006 (Сб) 6:04

raadmin, как правило, люди, заявляющие о "корявости VB во всей красе" (на этом поприще до тебя прославились, поверь мне), на самом деле не обладают даже базовыми знаниями о предмете и уж точно не имеют права делать подобных заявлений. Мне кажется, это как раз такой случай, особенно с учётом всего текста твоего последнего поста.

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

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 28.10.2006 (Сб) 6:15

И судя по всему статью автор так и не удосужился прочитать
Весь мир матрица, а мы в нем потоки байтов!


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

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

Сейчас этот форум просматривают: Bing-бот, Google-бот, Majestic-12 [Bot] и гости: 117

    TopList