powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проверка массива на пустоту
13 сообщений из 13, страница 1 из 1
Проверка массива на пустоту
    #36105304
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Определен массив вида
Код: plaintext
dim MyArr() as UserType
Назовем это состояние пустым.
Как проверить, что массив находится в этом состоянии не нарываясь на ошибку?

И еще, существует-ли возможность после Redim MyArr(N) вернуть массив в исходное, пустое состояние?
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36105321
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim arr() As String
Dim i As Integer

On Error Resume Next
i = UBound(arr)
If Err.Number <>  0  Then
Debug.Print "не инициализирован"
Else
Debug.Print "использовался"
End If
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36105354
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
Да, именно так и делаю. Думал, что возможно есть прямой способ без
Код: plaintext
1.
On Error Resume Next
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36105359
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Erase arr
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36105392
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One
Код: plaintext
Erase arr
Спасибо большое. Сейчас попробую.
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36106021
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

"Не нарываясь на ошибку..."

:0)
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36106370
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnKonst_One,
"Не нарываясь на ошибку..."
:0)имеется в виду некий штатный метод. :)
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36106426
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,

Штатного метода не существует, есть только с нарыванием на ошибку. Единственное исключение, которое я знаю, имеется для числовых массивов. Строковые массивы тоже в принципе можно, но только трогая манифест, что никто делать скорее всего не станет. Для числовых же массивов такой "штатный" метод есть.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal Length As Long)

Public Declare Function VarPtrArray Lib "msvbvm60.DLL" Alias "VarPtr" _
    (Ptr() As Any) As Long

Private lngMyLongArray() As Long

MsgBox ArrayHasElements(VarPtrArray(lngMyLongArray)) 

Public Function ArrayHasElements(arrTest As Long) As Boolean
    Dim lngResult As Long
    CopyMemory lngResult, ByVal arrTest,  4 
    ArrayHasElements = lngResult
End Function
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36106446
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConn, Плиз, посмотрите темку, м.б. чего скажете. :) Скользящий массив ]http://www.sql.ru/forum/actualthread.aspx?tid=682087
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36106458
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConnYUBA,

Штатного метода не существует, есть только с нарыванием на ошибку. Единственное исключение, которое я знаю, имеется для числовых массивов. Строковые массивы тоже в принципе можно, но только трогая манифест, что никто делать скорее всего не станет. Для числовых же массивов такой "штатный" метод есть.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal Length As Long)

Public Declare Function VarPtrArray Lib "msvbvm60.DLL" Alias "VarPtr" _
    (Ptr() As Any) As Long

Private lngMyLongArray() As Long

MsgBox ArrayHasElements(VarPtrArray(lngMyLongArray)) 

Public Function ArrayHasElements(arrTest As Long) As Boolean
    Dim lngResult As Long
    CopyMemory lngResult, ByVal arrTest,  4 
    ArrayHasElements = lngResult
End Function

Да уж, лучше -On error.... :)
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36106461
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VladConn,
YUBA,

проверка указателя на структуру SAFEARRAY действует на массив любого типа, не только численного:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Option Explicit

Private Declare Function ArrPtr Lib "msvbvm60" Alias "VarPtr" ( _
   pArr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
   Destination As Any, Source As Any, ByVal Length As Long)

Private Type POINTAPI
   x As Long
   y As Long
End Type

Private Sub Command1_Click()
 Dim MyArr() As POINTAPI
 
 CopyMemory psaMyArr, ByVal ArrPtr(MyArr),  4 
 Debug.Print psaMyArr 'выдаст 0
End Sub
YUBA,
Есть ещё (баго-?)фича, которая очень проста в применении, но недокументирована и вряд ли может быть рекомендована:
Код: plaintext
1.
2.
 Dim MyArr() As POINTAPI
 
 Debug.Print Not MyArr 'выдаст - 1 
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36106462
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл:
Код: plaintext
 Dim psaMyArr As Long
...
Рейтинг: 0 / 0
Проверка массива на пустоту
    #36109809
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проверка массива на пустоту
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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