lenArray = (UBound(arr) - LBound(arr) + 1)*LenB(LBound(arr))
Private Type SAFEARRAY
cDims As Integer 'Число размерностей
fFeatures As Integer 'Флаг, юзается функциями SafeArray
cbElements As Long 'Размер одного элемента в байтах
cLocks As Long 'Сколько раз массив был locked, но пока не unlocked.
pvData As Long 'Указатель на данные.
rgsabound As SAFEARRAYBOUND 'Повторяется для каждой размерности.
End Type
Хакер писал(а):Какого ..кхм.. ты привёл сюда описание структуры SAFEARRAY ?
Ты вообще понимаешь, что ты делаешь?
Хакер писал(а):И что есть "размер данных элемента"? Размер строки? Ты не знаешь как определить размер строки? Или не размер строки? А что тогда?
я хочу, чтобы на моём примере мне написали, как это всё выглядит в памяти
почему размер моей структуры 5 байт, д.б. 8, т.к. структура выравнивается по границе 4
что идёт далее в памяти по указателю pvData
А может быть лучше самому снять дамп памяти и посмотреть?
Почему 5 я думаю понятно?
Почему "д.б. 8" мне не понятно. Ничего не выравнивается.
что идёт далее в памяти по указателю pvData
Первый элемент массива.
Хакер писал(а):почему размер моей структуры 5 байт, д.б. 8, т.к. структура выравнивается по границе 4
Почему 5 я думаю понятно?
Почему "д.б. 8" мне не понятно. Ничего не выравнивается.
Private Type t_5bytes
spacer(1 To 5) As Byte
End Type
Private Sub Form_Load()
Dim ega(10) As t_5bytes
Debug.Print VarPtr(ega(5)) - VarPtr(ega(4))
End Sub
SAFEARRAY
Баунды
.....
BYTE
DWORD
BYTE
DWORD
P.S. Что-то у меня этот сайт сильно тормозит, господа, переходите сюда http://forum.sources.ru/
Хотел написать ф-ю, которой передаётся указатель на массив и по внутреннему описанию массива в памяти ф-я шагает по памяти и собирает размеры данных - можно всего массива, можно для 1 элемента - практично для As UserType.
Private Declare Function GetMem4 Lib "msvbvm60" (ByVal pSrc As Long, ByVal pDst As Long) As Long
Private Type stru
b As Byte
s As String
End Type
Private Sub Form_Load()
Dim Arr(9) As stru, d As Long, res As Long, LenStr As Long
Arr(0).s = "aaa"
res = GetMem4(VarPtr(Arr(0)) + 4, VarPtr(d))
Debug.Print d; StrPtr(Arr(0).s)
res = GetMem4(d - 4, VarPtr(LenStr))
Debug.Print LenStr / 2; Len(Arr(0).s)
End Sub
Private Type stru
name1 As Byte
name2 As Byte
name3 As Byte
name4 As Integer
name5 As Byte
name6 As String
End Type
Private Sub Form_Load()
Dim Arr(9) As stru
Debug.Print "name1 As Byte"; VarPtr(Arr(0).name1) - VarPtr(Arr(0))
Debug.Print "name2 As Byte"; VarPtr(Arr(0).name2) - VarPtr(Arr(0))
Debug.Print "name3 As Byte"; VarPtr(Arr(0).name3) - VarPtr(Arr(0))
Debug.Print "name4 As Integer"; VarPtr(Arr(0).name4) - VarPtr(Arr(0))
Debug.Print "name5 As Byte"; VarPtr(Arr(0).name5) - VarPtr(Arr(0))
Debug.Print "name6 As String"; VarPtr(Arr(0).name6) - VarPtr(Arr(0))
Unload Me
End Sub
Source писал(а):Интересно, зачем в VB есть ф-и получения указателей, если даже нет ф-й по получению значений в памяти по указателю?
Source писал(а):Как я понимаю, неявный перебор элементов структуры с целью определения их типа невозможен?
Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 94