Проинициализирован ли массив?

Автор karpo518, 4 апреля 2017, 15:49

0 Пользователи и 1 гость просматривают эту тему.

karpo518

Добрый день. В большинстве случаев обращение к не проинициализированному динамическому массиву вызывает ошибку. Как определить проинициализирован массив или нет?
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

economist

on error resume next
isInitArray=Ubound(arr)
on error goto 0
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

karpo518

Спасибо за ответ. Подскажите, как пользоваться вашим кодом? Пример ниже возвращает UBound = 0 и Err=0 независимо от того, проинициализирован массив или нет


Dim arr1() As String, arr2 As String
arr1 = Split("a,b", ",")
sizeOfStack(arr1)
sizeOfStack(arr2)


Function sizeOfStack(sStack() As String)
Dim c As Long
On Error Resume Next
c = UBound(sStack)
On Error Goto 0
MsgBox(c)
MsgBox(Err)
End Function

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

JohnSUN

А в таких случаях (когда переменная УЖЕ массив просто потому, что в Dim она описана как массив, а не как Variant), работает проверка
If LBound(sStack) <= UBound(sStack) Then ...
Фокус в том, что для пустого массива UBound() покажет "минус единицу", а для массива с одним элементом LBound() = UBound()
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

karpo518

JohnSUN, посмотрите на мой пример. UBound пустого массива возвращает 0, а не -1
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

karpo518

ЦитироватьА LBound() пустого массива не единица ли?

Нет, тоже ноль
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

JohnSUN

Молодец! Ты сбил с толку и Бэйсик, и меня  ;D
В описании параметра функции ты заявляешь, что полученная переменная это массив строк. А сам передаешь туда что попало.

Попробуй такой вариант
Sub test
Dim arr1 As Variant, arr2 As String
If isArray(arr1) then
sizeOfStack(arr1)
Else
MsgBox("arr1 пока не массив ")
EndIf
arr1 = Array()
If isArray(arr1) then
sizeOfStack(arr1)
Else
MsgBox("arr1 пока не массив ")
EndIf
arr1 = Split("a,b", ",")
If isArray(arr1) then
sizeOfStack(arr1)
Else
MsgBox("arr1 всё ещё не массив ")
EndIf
If isArray(arr2) then
sizeOfStack(arr2)
Else
MsgBox("arr2 не массив ")
EndIf
End sub

Function sizeOfStack(sStack As Variant)
Dim lB As Long, uB As Long
uB = UBound(sStack)
lB = LBound(sStack)
MsgBox("Границы массива " & lB & "..." & uB & " и элементов в нём " & (uB-lB+1))
End Function
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

karpo518

Ваш пример работает. Вы хотите сказать, что динамические массивы правильнее объявлять с типом Variant, чтобы не было проблем с функциями вроде "sizeOfArray"? Ранее я объявлял строковые массивы в виде "Dim arr() As String", а принимал их в функциях в виде переменных типа Object. Сейчас впервые столкнулся с проблемой распознавания пустого массива при создании функции получения размера массива. Теперь потребуется переписать инициализацию большого количества массивов, поэтому хотел бы узнать ваше мнение.
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

economist

У меня своё правило - в StarBasic и VBA - все массивы всегда объявлять как Varaint, то есть вообще не указывать тип As... 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...