powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Утилитки
2 сообщений из 27, страница 2 из 2
Утилитки
    #32655792
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov VictoshaПрироду и происхождение вопроса я не понял. Но как-нибудь отвечу.
Скажу честно – я не знаю, как его назвать.
Возможно – «нечистым» - более умного я вряд ли придумаю. Ну, разве что – «массив с искаженным описателем».

Мне неизвестен способ объявления массива с такими описателями в рамках синтаксиса языка – Redim ar(False to True) - не прокатит, прокатит только Redim ar(True to False).

Как понять неизвестен? Такой массив возвращает функция Array с пустым списком аргументов, как я написал.

что ж - уеден с потрохами. Хорошо хоть выражение лица есть.
Хотя я все рано не знаю как назвать такой массив, невзирая на то, чтов данном конкретном случае придется признать его пустым. Ну, хоть понятно как Ubound работает - в лоб - Ubound(dimNumber) = Bounds(DimNumber-1).Lbound + Bounds(DimNumber-1).cElements - 1

Хотя честнее со стороны Array() было бы не возвращать никакого описателя.
Ну раз уж он/она это пакостное дело делает (в отличие от Dim Ar() ), то желанная пустота (массива) проверяется так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(hpvDest As Any, _
hpvSource As Any, _
ByVal cbCopy As Long)


Type SAFEARRAY
  cDims As Integer      'число рамерностей в массиве 
  fFeatures As Integer  'св-ва типа являются ли данные указателями на строки, объекты, варианты или представляют собой непрерывный массив данных 
  cbElements As Long    'размер одного элемента в байтах 
  cLocks As Long        ' 
  pvData As Long        'указатель на данные 
End Type


Function IsVariantEmpty(varVar As Variant) As Boolean

 'проверяет полученную переменную на "пустоту" 
 'возвратит истину для неинициализированного массива, 
 'объектной переменной значение которой Is Nothing 
 'или неинициализированного варианта 

  If IsArray(varVar) Then
    Dim lngArrAddress As Long, saPtr As Long
     'получаем указатель на элемент данных 
    CopyMemory lngArrAddress, ByVal VarPtr(varVar) +  8 ,  4 
    
    'получаем адрес описателя массива 
    ' для неинициализированного массива он всегда будет 0 
   CopyMemory saPtr, ByVal lngArrAddress,  4 
   If saPtr <>  0  Then
     Dim arDesc As SAFEARRAY  ' 1D 
     CopyMemory ByVal VarPtr(arDesc), ByVal lngArrAddress, Len(arDesc)
     IsVariantEmpty = arDesc.pvData =  0 
   Else
     IsVariantEmpty = True  'saPtr = 0 
   End If
  ElseIf IsObject(varVar) Then
    IsVariantEmpty = (varVar Is Nothing)
  Else
    IsVariantEmpty = IsEmpty(varVar)
  End If
End Function

раньше ответить не мог - у мене интернета на исходе (собственно кончилась уже)

:)
...
Рейтинг: 0 / 0
Утилитки
    #32655993
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictoshaХотя честнее со стороны Array() было бы не возвращать никакого описателя. - не скажите: по-моему так они поступили весьма находчиво и изящно!
Смотрите, это ведь Вы писали:
Victosha2) массивы и обрашения к ним чаще всего в рамках какихто циклов встречаются. В этом смысле Ubound универсально охраняет как от обращения к неинициализированному массиву, так и определяет (верхние) границы циклов.- соответственно, если бы Array() "не возвращал никакого описателя" ...
(((что, как я понимаю, означает: возвращать НЕИНИЦИАЛИЗИРОВАННЫЙ массив, - типа - как это делает функция:
Код: plaintext
1.
2.
3.
Public Function UnInitialized_Array()
                  Dim arr()
UnInitialized_Array = arr
End Function
)))
... тогда бы все последующие циклы массиву - типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub UnInitialized_Array________TEST()
Dim arr
    arr = UnInitialized_Array()
    
Debug.Print TypeName(arr), IsArray(arr)

For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i)
Next
End Sub
- генерили бы ошибку!

А для Array() - все тип-топ, циклы "работают", потому как - оказываются "пустыми":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Array_NoElements_______TEST()
Dim arr
    arr = Array()
    
Debug.Print TypeName(arr), IsArray(arr)

For i = LBound(arr) To UBound(arr)
    Debug.Print arr(i)
Next
End Sub
...
Рейтинг: 0 / 0
2 сообщений из 27, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Утилитки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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