Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Проверка размерности неинициализированного массива Добавлено: 28.07.12 10:26  

Автор вопроса:  П.С. | Web-сайт: psbatishev.narod.ru | ICQ: 225019134 
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-сайт: psbatishev.narod.ru
 Профиль | | #1
Добавлено: 28.07.12 10:33
Вопрос скорее надо было сформулировать: "Как узнать, что массив не был инициализирован?"

Ответить

Номер ответа: 2
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #2
Добавлено: 28.07.12 12:03
Лично я либо обрабатываю ошибку, либо храню переменную с размером массива.

Ответить

Номер ответа: 3
Автор ответа:
 Mikle



Вопросов: 5
Ответов: 134
 Профиль | | #3 Добавлено: 29.07.12 13:27
Как узнать, что массив не был инициализирован?

Это давно известно:
  1. Dim a() ' As Long, String ...
  2.  
  3. If (Not a) = -1 Then
  4.   Debug.Print "array as not been initialized"
  5. Else
  6.   Debug.Print "array as been initialized " & UBound(a)
  7. End If
  8.  
  9. ReDim a(2)
  10.  
  11. If (Not a) = -1 Then
  12.   Debug.Print "array as not been initialized"
  13. Else
  14.   Debug.Print "array as been initialized " & UBound(a)
  15. End If

Ответить

Номер ответа: 4
Автор ответа:
 П.С.



ICQ: 225019134 

Вопросов: 36
Ответов: 41
 Web-сайт: psbatishev.narod.ru
 Профиль | | #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
Ответов: 6597
 Профиль | | #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-сайт: psbatishev.narod.ru
 Профиль | | #6
Добавлено: 01.08.12 19:21
Спасибо за ответы. По ссылке также все прочитал. Понял, что в VB6 адекватного способа проверки инициализации массива все же нет. Если конечно сразу это учитывать в программе, то можно проверить приведенным выше способом. В моем случае, к сожалению, придется переписывать достаточно объемную программу, чтобы избавиться от возникающей ошибки.

Ответить

Номер ответа: 7
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #7
Добавлено: 05.08.12 20:31
  1. If (Not a) = -1 Then
Не делать так никогда. У меня появились ошибки совсем в других участках программы, что ввело в ступор, ибо там я ничего не трогал.

Ответить

Номер ответа: 8
Автор ответа:
 Mikle



Вопросов: 5
Ответов: 134
 Профиль | | #8 Добавлено: 06.08.12 10:14
А можно локализовать ошибку? Хотелось бы узнать, где это вылазит.

Ответить

Номер ответа: 9
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #9
Добавлено: 07.08.12 12:21
уже не вспомню. ну что-то совсем бредовое было) вроде ошибки на инструкции while в другой функции.
по теме: я всегда юзал
  1. Public Function UUBound(arr) As Long
  2. On Error GoTo 1:
  3.     UUBound = UBound(arr)
  4. Exit Function
  5. 1:  UUBound = -1
  6. End Function

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6597
 Профиль | | #10 Добавлено: 08.08.12 04:12
oh god why

Ответить

Страница: 1 |

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





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