Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: проверка инициализации массива Добавлено: 25.12.10 19:45  

Автор вопроса:  Winand | Web-сайт: winandfx.narod.ru
В инете встречается такой способ для vb6.
if not <arr> = -1 then
  'в массиве нет эл-тов
end if
Его использовать нельзя. Возникают ошибки типа Expression too complex. При том совсем в других местах возникают.
з.ы. На дотнете наверняка таких проблем не возникает..

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #1 Добавлено: 25.12.10 19:54
что ты имеешь ввиду под проверкой инициализации массива

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #2
Добавлено: 25.12.10 20:04
Я имел в виду, является массив пустым или в нём есть элементы.
Вообще самый простой способ проверки: on error + ubound. Есть еще вариант хранить текущую размерность в переменной, которой изначально задавать -1.

Ответить

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



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #3 Добавлено: 26.12.10 01:02
Последнее красивее, абаунд становится ненужен.

Ответить

Номер ответа: 4
Автор ответа:
 HIWORD



Вопросов: 0
Ответов: 14
 Профиль | | #4 Добавлено: 26.12.10 02:23
Походу, оба способа кривые. Предлагаю еще один:
  1.  
  2. ...
  3. Public Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ptr() As Any) As Long
  4. Public Declare Sub RtlMoveMemoryPtr Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
  5. Public Declare Function SafeArrayGetUBound Lib "oleaut32" (ByVal psa As Long, ByVal nDim As Long, ByVal plUbound As Long) As Long
  6.  
  7. Public Function UboundMe(arptr As Long, Optional dims As Long = 1) As Long
  8.     UboundMe = -1
  9.     RtlMoveMemoryPtr VarPtr(arptr), arptr, 4
  10.     SafeArrayGetUBound arptr, dims, VarPtr(UboundMe)
  11. End Function
  12.  
  13. Sub test()
  14.   Dim lngArr() As Long
  15.   Debug.Print UboundMe(VarPtrArray(lngArr))
  16.   ReDim lngArr(10)
  17.   Debug.Print UboundMe(VarPtrArray(lngArr))
  18. End Sub

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #5
Добавлено: 26.12.10 12:32
А тут не классно, что нужно передавать в функцию результат другой функции. Загромождение такое в коде.

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 26.12.10 23:39
проверка инициализации массива

а почему просто не проверить на null? Или как там у вас.. Nothing?

Ответить

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



Вопросов: 0
Ответов: 14
 Профиль | | #7 Добавлено: 27.12.10 02:34
Потому что это бессмысленно.
Dim lngArr() As Long
По адресу якобы неинициализированной lngArr на самом деле хранится структура SAFEARRAY.
В которой член pvData - есть адрес первого элемента массива - &lngArr[0](если массив инициализирован), а, например, cbElements - кол-во элементов в массиве.
Засада в vb6 в получении адреса этой структуры. Поэтому приходится вводить VarPtrArray, которая возвращает "указатель на указатель" структуры, что несколько загромождает код.
Но это точно лучше, чем отдельно хранить размерность с риском ошибиться, или шаманство типа
if not not lngArr then

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #8
Добавлено: 27.12.10 18:00
шаманство реально нельзя использовать:) оно то ли модифицирует указатель, то ли еще какая-то хрень. Я не смог разобраться.
Зато вот такое работает всегда хорошо
  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

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 28.12.10 19:15
извращенство..

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #10
Добавлено: 29.12.10 20:34
Я не знаю о чем думали разрабы vb6 в далеких годах, когда пилили язык.
з.ы. Пора ёлку ставить пожалуй:)

Ответить

Номер ответа: 11
Автор ответа:
 udn79



Вопросов: 2
Ответов: 95
 Профиль | | #11 Добавлено: 04.02.11 02:38
1) динамический массив обьявляется как Redim mas(n) as Long
переменная n или число, параметры обязательные
2) у обьявления Dim mas() свои задачи, не нужно его использовать если не знаете назначения
3) Redim mas(n) даже при n=0 займет 4 байта, тогда как не осмысленное попытка проверить инициализацию Dim mas() куда больше

Единственая цель Dim tmp() // если не понятно из названия для хранения массивов ну и так по мелочи

  1.  
  2. Dim tmp()
  3. Dim a(10)
  4. ReDim b(10)
  5. tmp = a
  6. Stop
  7. tmp = b
  8. Stop


Исключение байтового массива, от может работать и хранить строки
  1. Dim tmp()as byte
  2. tmp="Привет"


так что избегайте конструкцый Dim mas() если они вам не требуются
Описал возможности в кратце, только чтобы имели представления

Ответить

Страница: 1 |

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



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