Страница: 1 |
Страница: 1 |
Вопрос: Проверка размерности неинициализированного массива
Добавлено: 28.07.12 10:26
Автор вопроса: П.С. | Web-сайт:
Visual Basic 6
Как определить размер массива, если он не инициализован?
Выполняемые действия (код ниже):
1) объявляем переменную - будущий массив: здесь не указываем ни тип данных, ни размерность, иначе не сработает,
2) создаем массив с помощью функций, возвращающих массив,
3) если массив создан, то определение размерности и очистка проходят без ошибок.
Проблема: если по каким-либо причинам будет пропущен шаг 2), то на шаге 3) при проверке и очистке программа уходит на ошибку. Как проверить, что массив не был инициирован?
'1)
Dim ar
'2)
ar=Array("нулевой", "первый")
ar=Split("нулевой,первый", ",")
'3)
i=Ubound(ar)
Erase ar
Послесловие: вроде бы это и не проблема, обработать ошибку можно, да и Ubound для пустого массива возвращает -1 (но все же уходит на ошибку), но во-первых компилированная версия - exe гораздо менее защищена от возникающих в ней ошибок, во-вторых, на том же участке кода бывает нужно отслеживать другие ошибки.
Разные способы типа ar is Nothing не дают результата, поэтому и обращаюсь. Ситуация осложняется также тем, что до инициализации массива - это и не массив, а простая переменная, которой даже может быть присвоено какое-либо значение. Одновременное упоминание переменной как ar и ar(0) в одном из случаев однозначно приведет к ошибке. Буду благодарен за советы...
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
П.С.
ICQ: 225019134
Вопросов: 36
Ответов: 41
Web-сайт:
Профиль | | #1
Добавлено: 28.07.12 10:33
Вопрос скорее надо было сформулировать: "Как узнать, что массив не был инициализирован?"
Номер ответа: 2
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #2
Добавлено: 28.07.12 12:03
Лично я либо обрабатываю ошибку, либо храню переменную с размером массива.
Номер ответа: 3
Автор ответа:
Mikle
Вопросов: 5
Ответов: 134
Профиль | | #3
Добавлено: 29.07.12 13:27
Это давно известно:
Номер ответа: 4
Автор ответа:
П.С.
ICQ: 225019134
Вопросов: 36
Ответов: 41
Web-сайт:
Профиль | | #4
Добавлено: 29.07.12 22:35
Спасибо за пример, пример действительно интересный.
Провел эксперимент и выяснил, что если объявить массив Dim a(), то это все действительно работает. Если в примере заменить ReDim a(2) на a=Array("0","1","2" либо на a()=Array("0","1","2", то это прекрасно работает.
Однако, если воспользоваться функцией Split для инициализации массива, то она не может инициализировать массив, чудеса какие-то, для того, чтобы она заработала надо тогда объявлять массив как Dim a (без скобок), все бы хорошо, но тогда строчка 11) If (Not a) = -1 Then (когда она встречается в коде 2-й раз) выдает ошибку и не работает... как быть?
Номер ответа: 5
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #5
Добавлено: 30.07.12 00:20
http://stackoverflow.com/questions/183353/how-do-i-determine-if-an-array-is-initialized-in-vb6
over 9000 методов проверки того, инициализирован ли массив. On Error Resume Next и CopyMemory, как обычно, прилагаются.
Номер ответа: 6
Автор ответа:
П.С.
ICQ: 225019134
Вопросов: 36
Ответов: 41
Web-сайт:
Профиль | | #6
Добавлено: 01.08.12 19:21
Спасибо за ответы. По ссылке также все прочитал. Понял, что в VB6 адекватного способа проверки инициализации массива все же нет. Если конечно сразу это учитывать в программе, то можно проверить приведенным выше способом. В моем случае, к сожалению, придется переписывать достаточно объемную программу, чтобы избавиться от возникающей ошибки.
Номер ответа: 7
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #7
Добавлено: 05.08.12 20:31
Номер ответа: 8
Автор ответа:
Mikle
Вопросов: 5
Ответов: 134
Профиль | | #8
Добавлено: 06.08.12 10:14
А можно локализовать ошибку? Хотелось бы узнать, где это вылазит.
Номер ответа: 9
Автор ответа:
Winand
Вопросов: 87
Ответов: 2795
Web-сайт:
Профиль | | #9
Добавлено: 07.08.12 12:21
уже не вспомню. ну что-то совсем бредовое было) вроде ошибки на инструкции while в другой функции.
по теме: я всегда юзал
Номер ответа: 10
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #10
Добавлено: 08.08.12 04:12
oh god why