powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как определить размерность массива???
12 сообщений из 12, страница 1 из 1
Как определить размерность массива???
    #33876268
michael23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Передаю в функцию массив ... необходимо знать ее размерность (одно, двух или более мерная).
Есть ли функция или как можно получить этот параметр в VBA (Excel)?
(в С#, например, A.Rank, где А - n-мерный массив (возвращает n))
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #33876351
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
UBound, LBound
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #33876399
michael23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если бы все было так просто ....
Я спрашивал не про размер, а про размерность массива
(Мне нужно отделить одномерные массивы от многомерных, для них вызывается другая функция из dll)
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #33876425
michael23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LBound(arrayname [, dimension])
UBound(arrayname [, dimension])
Вот как определить - "dimension"?
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #33876521
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Function mBound(arr As Variant) As String
  
  If IsArray(arr) Then
    Dim i As Integer
    i =  1 
    
    On Error Resume Next
    Do While True
      If IsError(UBound(arr, i)) Then
        Exit Do
      Else
        i = i +  1 
      End If
    Loop
    
    For i =  0  To i -  1 
      mBound = mBound & IIf(Len(mBound) =  0 , "", "x") & "(" & LBound(arr, i) & ".." & UBound(arr, i) & ")"
    Next i
  Else
    mBound = "0"
  End If
End Function

Private Sub Form_Load()
  Dim a( 1 ,  2 ,  3 ,  4 ,  5 ,  6 ) As Integer, i( 100  To  200 ) As Integer
  
  MsgBox mBound(i)
End Sub
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #33876577
michael23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aklin
Огромное спасибо!!!
(так и думал, что без обработки ошибок (IsError) не обойтись, уже сам начал писать, думал может функции какие по работе с массивами есть, чтобы не изобретать велосипед)
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #33876744
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
Public Declare Sub CopyMemory Lib "kernel32" _
   Alias "RtlMoveMemory" ( _
   pDest As Any, _
   pSrc As Any, _
   ByVal ByteLen As Long)

Public Function GetArrayDimensions( _
  ByVal arrPtr As Long) As Integer
   Dim address As Long
   
   CopyMemory address, ByVal arrPtr, ByVal  4 

   If address <>  0  Then
      CopyMemory GetArrayDimensions, ByVal address,  2 
   End If
End Function

Public Function VarPtrArray(arr As Variant) As Long
   CopyMemory VarPtrArray, ByVal VarPtr(arr) +  8 , ByVal  4 
End Function

Public Sub TestArray()
    Dim intDimensions As Integer
    Dim avarItems( 1  To  2 ,  1  To  3 ,  1  To  4 ) As Variant

    intDimensions = GetArrayDimensions(VarPtrArray(avarItems))
   
    If intDimensions >=  1  Then
       MsgBox "Массив содержит " & intDimensions & " измерений."
    Else
       MsgBox "Массив не инициализирован."
    End If
End Sub
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #33878257
michael23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ashton
Спасибо! Так бы я точно пока не написал.
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #33878841
Alexey Kudinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMO, лучше вариант от Aklin
Не стОит злоупотреблять CopyMemory там, где без этого можно обойтись
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #33880294
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey KudinovIMO, лучше вариант от Aklin
Не стОит злоупотреблять CopyMemory там, где без этого можно обойтись

Если корректно используется, то ничего плохого в ней нет

Мой вариант:

авторGetArrayDimensions - возвращает размерность массива или 0 если массив не инициализирован.

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

То есть UboundArray неинициализированного массива вернет -1.
------------------------------------------
Код: 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
Период между сообщениями больше года.
Как определить размерность массива???
    #38589939
Jpop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ashton,

А не могли бы вы поподробнее об функции CopyMemory рассказать...?
Что означают её параметры Alias "RtlMoveMemory", pDest, pSrc, ByteLen?
...
Рейтинг: 0 / 0
Как определить размерность массива???
    #38589974
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спустя 8 лет? навряд ли

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


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