Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

13 Декабрь 2017, 23:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Проинициализирован ли массив?  (Прочитано 818 раз)
0 Пользователей и 1 Гость смотрят эту тему.
karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Стартовое сообщение: 4 Апрель 2017, 15:49 »

Добрый день. В большинстве случаев обращение к не проинициализированному динамическому массиву вызывает ошибку. Как определить проинициализирован массив или нет?
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
economist
Ветеран
*****
Offline Offline

Сообщений: 761


« Ответ #1: 4 Апрель 2017, 16:32 »

on error resume next
isInitArray=Ubound(arr)
on error goto 0
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #2: 5 Апрель 2017, 10:31 »

Спасибо за ответ. Подскажите, как пользоваться вашим кодом? Пример ниже возвращает 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
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 373


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #3: 5 Апрель 2017, 10:37 »

А в таких случаях (когда переменная УЖЕ массив просто потому, что в Dim она описана как массив, а не как Variant), работает проверка
Код:
If LBound(sStack) <= UBound(sStack) Then ...
Фокус в том, что для пустого массива UBound() покажет "минус единицу", а для массива с одним элементом LBound() = UBound()
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #4: 5 Апрель 2017, 10:51 »

JohnSUN, посмотрите на мой пример. UBound пустого массива возвращает 0, а не -1
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #5: 5 Апрель 2017, 11:05 »

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

Нет, тоже ноль
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 373


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #6: 5 Апрель 2017, 11:14 »

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

Попробуй такой вариант
Код:
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
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #7: 5 Апрель 2017, 11:31 »

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

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
economist
Ветеран
*****
Offline Offline

Сообщений: 761


« Ответ #8: 5 Апрель 2017, 12:05 »

У меня своё правило - в StarBasic и VBA - все массивы всегда объявлять как Varaint, то есть вообще не указывать тип As... 
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!