Как (если возможно) изменить указатель на переменную?
Что-то вроде VarPtr(MyVar) = MyPtr.
Mikle писал(а):Можно только для массивов, ищи "safearray".
The trick писал(а):Для статических массивов нельзя.
Mikle писал(а):The trick писал(а):Для статических массивов нельзя.
А у меня получилось...
The trick писал(а):Скомпилируй.
Mikle писал(а):Скомпилировано. Старый проект, посмотри в модуле modTex:
Option Explicit
Private Declare Function GetMem4 Lib "msvbvm60" (ByVal lpSrc As Long, ByVal lpDst As Long) As Long
Private Declare Function PutMem4 Lib "msvbvm60" (ByVal lpDst As Long, ByVal Value As Long) As Long
Private Declare Function AryPtr Lib "msvbvm60" Alias "VarPtr" (Ary() As Any) As Long
Private Type My4BYTES
b1 As Byte
b2 As Byte
b3 As Long
b4 As Byte
End Type
Private Function SetDataPtr(ByVal ppAry As Long, ByVal pvData As Long) As Long
Dim p As Long
GetMem4 ppAry, VarPtr(p)
GetMem4 p + 12, VarPtr(SetDataPtr)
PutMem4 p + 12, pvData
End Function
Private Sub Form_Load()
Debug.Print "======================================================"
Dim TestAry(1 To 16) As Byte
Dim TestVar(0) As My4BYTES
Dim pvOld As Long
Dim i As Long
pvOld = SetDataPtr(AryPtr(TestVar), VarPtr(TestAry(3)))
For i = 1 To 16
TestAry(i) = i
Next
Debug.Print Hex(TestVar(0).b1), Hex(TestVar(0).b2), Hex(TestVar(0).b3), Hex(TestVar(0).b4)
TestVar(0).b1 = &HF0
TestVar(0).b2 = &HF0
TestVar(0).b3 = &HF0F0F0F0
TestVar(0).b4 = &HF0
Dim sTmp As String
For i = 1 To 16
sTmp = sTmp & Hex(TestAry(i)) & " "
Next
Debug.Print sTmp
SetDataPtr AryPtr(TestVar), pvOld
End Sub
ger_kar писал(а):Они не пропускаются, а просто идут в другом порядке. В переменной Long 4 байта и в памяти они расположены в порядке от более младших разрядов к старшим, т.е. можно сказать ровно наоборот, если сравнивать с человеческим порядком восприятия.
Jack Ferre писал(а):Т.е. адрес переменной в структуре должен быть кратен её длине?
Сейчас этот форум просматривают: Yandex-бот и гости: 26