powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Динамический массив
14 сообщений из 14, страница 1 из 1
Динамический массив
    #34428039
Катяра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, помогите плиз. В финкцию или процедуру передается динамический массив. Как проверить пустой он или нет????
...
Рейтинг: 0 / 0
Динамический массив
    #34428063
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каком смысле пустой? Ubound = LBound?
...
Рейтинг: 0 / 0
Динамический массив
    #34428087
Катяра
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MelkiadesВ каком смысле пустой? Ubound = LBound?
Не верно вырозился .... инициализирован(массив) ли он или нет?????
...
Рейтинг: 0 / 0
Динамический массив
    #34428329
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Катяра MelkiadesВ каком смысле пустой? Ubound = LBound?
Не верно вырозился .... инициализирован(массив) ли он или нет?????

т.е. если его размер НИГДЕ не задавался. будет вроде -1 в UBound
...
Рейтинг: 0 / 0
Динамический массив
    #34428422
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если массив не инициализирован то попытка вызвать Lbound Ubound вывалится с ошибкой. Его практически никак проверить нельзя(если не ошибаюсь), кроме как ловить эту ошибку.
Единственный приличный обходиной путь, на мой взгляд - обьявить его параметром as variant и этом случае если его не передавать то можно будет проверить по IsMissing.



Magnus
...
Рейтинг: 0 / 0
Динамический массив
    #34428424
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый простой подход, работающий для массивов всех типов: обработка ошибки 9.

Ниже я покажу способ, работающий для всех массивов, кроме строковых, на примере массива типа Long:

В модуле:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
Public Declare Function VarPtrArray Lib "msvbvm60.DLL" Alias "VarPtr" (Ptr() As Any) As Long

Public Function MassivInitzializirovan(lngTest As Long) As Boolean
Dim lngResult As Long
CopyMemory lngResult, ByVal lngTest, 4
MassivInitzializirovan = lngResult
End Function

В форме:

Private Sub Command1_Click()
Dim blnResult As Boolean
Dim lngArray() As Long

blnResult = MassivInitzializirovan(VarPtrArray(lngArray))
Debug.Print blnResult

ReDim lngArray(1)
blnResult = MassivInitzializirovan(VarPtrArray(lngArray))
Debug.Print blnResult

End Sub
...
Рейтинг: 0 / 0
Динамический массив
    #34445797
polyakstar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть дедовский способ
в массиве Mass(i) mass(0) резервируешь под размерность массива
а данные номеруешь от 1.
а потом, когда юзаешь в цикле че-та типа этого

Код: plaintext
1.
2.
3.
for i =  1  to mass( 0 )
     msgbox mass(i)
next i
...
Рейтинг: 0 / 0
Динамический массив
    #34446414
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне все же казалось что ubound даст -1

а что, кстати, мешает его инициализоровать нулем сразу?

а то напридумывали фигни какой-то про варианты, 0 элемент как размер... жуть...

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
Динамический массив
    #34446589
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, возиться с вычислением размера массива на обработчиках ошибок - себе дороже.
Лучше инициализировать сразу нулем.
...
Рейтинг: 0 / 0
Динамический массив
    #34446912
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Держите пару функций:
------------------------------------------
GetArrayDimensions - возвращает размерность массива или 0 если массив не инициализирован.

UBoundArray - возвращает кол-во элементов в указанной размерности массива или -1 если данная размерность не инициализирована.

То есть UBoundArray неинициализированного массива вернет -1.
------------------------------------------
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Function UBoundArray(ArrayName As Variant, Optional Dimension As Integer =  1 ) As Long
    If Dimension <  1  Or Dimension > GetArrayDimensions(ArrayName) Then
        UBoundArray = - 1 
    Else
        UBoundArray = UBound(ArrayName, Dimension)
    End If
End Function

Public Function GetArrayDimensions(arr As Variant) As Integer
    Dim a As Long

    CopyMemory a, ByVal VarPtr(arr) +  8 ,  4 
    CopyMemory a, ByVal a,  4 
    If a Then CopyMemory GetArrayDimensions, ByVal a,  2 
End Function
...
Рейтинг: 0 / 0
Динамический массив
    #34446928
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по-моему, UBound и так -1 вернет.

а вы чего-то замутили... жуть...
так вот. не легче ли вместо копирования приписать ОДНУ единственную строчку ? redim в 0. ???

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
Динамический массив
    #34447004
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aklinпо-моему, UBound и так -1 вернет.

Ubound неинициализированного массива вернет только ошибку.
Которую надо перехватывать и обрабатывать - можно, правда, идти и таким путем.

Aklinтак вот. не легче ли вместо копирования приписать ОДНУ единственную строчку ? redim в 0. ???

Не лучше.
...
Рейтинг: 0 / 0
Динамический массив
    #34447326
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrF Aklinпо-моему, UBound и так -1 вернет.

Ubound неинициализированного массива вернет только ошибку.
Которую надо перехватывать и обрабатывать - можно, правда, идти и таким путем.

Aklinтак вот. не легче ли вместо копирования приписать ОДНУ единственную строчку ? redim в 0. ???

Не лучше.

если инициализоровать нулем, ошибки НЕ будет.

поясните, почему не легче ,если вам теперь приходиться лезть в память, а если ошибка при работе с памятью?

инициализоровать нулем - ГОРАЗДО проще, чем то, что вы показали.
...
Рейтинг: 0 / 0
Динамический массив
    #34447340
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к тому же я сэкономил КУЧУ бестолкового кода.

ну а если делать все через ж, то это гораздо проще, чем ваш вариент:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Form_Load()
  Dim b() As Integer
  MsgBox MyBound(b)
End Sub

Function MyBound(MyArr As Variant, Optional iBound As Integer =  1 )
  On Error Resume Next
  MyBound = - 1 
  MyBound = UBound(MyArr, iBound)
End Function

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Динамический массив
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]