Тимофей писал(а):Нашел в статьях, спасибо.
Ах это! Я смотрел (именно, что смотрел), потому какТимофей писал(а):Лови
http://vbstreets.ru/VB/Articles/65977.aspx
alibek писал(а):Ты еще не читал наших апостолов (GSerg и иже с ними?)? Срочно в статьи, там как раз есть пример, как узнать, инициализирован ли массив или нет.
codemaster писал(а):Жалко что в этом форуме нет места для обсуждения статей.
но это вопрос скорее к модераторам.
gaidar писал(а):Новые статьи будут иметь такие ссылки.
codemaster писал(а):к сожалению автор вопроса не написал тип массива и предполагаемый (ожидаемый) размер.
В случае с типом arr() as string
произойдет перевод BSTR в ABSTR
и если массив будет не путым а большим тормоза обеспечены.
( В статье это кстати выдается за "фишку" но может я что то не понимаю )
Option Explicit
Private Declare Function GetMem4 Lib "msvbvm60" (ByVal pSrc As Long, ByVal pDst As Long) _
As Long
Public Function StrArrPtr(arr() As String, Optional ByVal IgnoreMe As Long = 0) As Long
GetMem4 VarPtr(IgnoreMe) - 4, VarPtr(StrArrPtr)
End Function
Private Sub Command1_Click()
On Error Resume Next
Const CONST_ARR_SIZE As Long = 100000
Dim arr() As String
Dim laPtr As Long, lSize As Long
'
ReDim arr(CONST_ARR_SIZE) As String
'
laPtr = StrArrPtr(arr())
'
lSize = UBound(arr())
'
Debug.Print lSize, laPtr
'
End Sub
mov eax, [esp+4]
mov ecx, [esp+8]
mov eax, [eax]
mov [ecx], eax
xor eax, eax
ret 8
mov eax, [esp+4]
ret 4
Public Function UboundArray(ArrayName As Variant, Optional Dimension As Integer = 1) As Long
Dim d As Long
d = GetArrayDimensions(ArrayName)
If Dimension < 1 Or Dimension > d Then
UboundArray = -1
Else
UboundArray = UBound(ArrayName, Dimension)
End If
End Function
Public Function GetArrayDimensions(arr As Variant) As Integer
Dim a As Long, b As Long
CopyMemory b, ByVal VarPtr(arr) + 8, ByVal 4
CopyMemory a, ByVal b, ByVal 4
If a Then CopyMemory GetArrayDimensions, ByVal a, 2
End Function
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
GSerg писал(а):Укажи мне место, которое тормозит
Сейчас этот форум просматривают: Google-бот и гости: 0