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

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



Magnus
...
Рейтинг: 0 / 0
30.03.2007, 18:03
    #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
08.04.2007, 16:13
    #34445797
polyakstar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
есть дедовский способ
в массиве Mass(i) mass(0) резервируешь под размерность массива
а данные номеруешь от 1.
а потом, когда юзаешь в цикле че-та типа этого

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

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

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

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
09.04.2007, 10:38
    #34446589
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
Да, возиться с вычислением размера массива на обработчиках ошибок - себе дороже.
Лучше инициализировать сразу нулем.
...
Рейтинг: 0 / 0
09.04.2007, 12:04
    #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
09.04.2007, 12:07
    #34446928
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический массив
по-моему, UBound и так -1 вернет.

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

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

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

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

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

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

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

Не лучше.

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

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

инициализоровать нулем - ГОРАЗДО проще, чем то, что вы показали.
...
Рейтинг: 0 / 0
09.04.2007, 13:56
    #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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Динамический массив / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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