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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| Sub DarkVader1()
'https://www.developpez.net/forums/d870138/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/trucs-astuces-quelques-observations-varptr-and-co/
'Une adresse unique par espace de stockage - 2,4 ou 8 octets - String fixe ou non à part
'Stockage par id dentique aux énumérations !?
'Peut-être une voie pour modifier une constante en cours d'exécution ?
Const k1 As Byte = 1
Const k2 As Long = 2
Const k3 As Double = 3
Const k4 As Double = 3
Const k5 As Integer = 3
Const k6 As Long = 3
Const k7 As String * 2 = "3"
Const k8 As String = "3"
Const k9 As String = "3"
Const k10 As Byte = 155
Debug.Print "Const k1 As Byte", VarPtr(k1)
Debug.Print "Const k2 As Long", VarPtr(k2)
Debug.Print "Const k3 As Double", VarPtr(k3)
Debug.Print "Const k4 As Double", VarPtr(k4)
Debug.Print "Const k5 As Integer", VarPtr(k5)
Debug.Print "Const k6 As Long", VarPtr(k6)
Debug.Print "Const k7 As String *", VarPtr(k7)
Debug.Print "Const k8 As String", VarPtr(k8)
Debug.Print "Const k9 As String", VarPtr(k9)
Debug.Print "Const k10 As Byte", VarPtr(k10)
End Sub
Sub DarkVader2()
'RAS : 2 adresses différentes pointant sur un SAFEARRAY
Dim myTab1() As Long, myTab2() As Long
ReDim myTab1(5)
ReDim myTab2(5)
Debug.Print VarPtrArray(myTab1())
Debug.Print VarPtrArray(myTab2())
End Sub
Sub DarkVader3()
'Comportement inattendu : Une adresse unique pour tous les tableaux quelquesoit le type !!!
'Eviter d'utiliser les pointeurs sur les tableaux prédimensionnés semble de bon sens ou utiliser des tableaux redimensionnables.
Dim t1(5) As Integer, t2(1) As Long, t3(1) As Byte, t4(1) As Single, t5(1) As Double, t6(1) As Long, t7(1) As Integer
Debug.Print "t1(5) As Int", VarPtrArray(t1())
Debug.Print "t2(1) As Lng", VarPtrArray(t2())
Debug.Print "t3(1) As Byt", VarPtrArray(t3())
Debug.Print "t4(1) As Sng", VarPtrArray(t4())
Debug.Print "t5(1) As Dbl", VarPtrArray(t5())
Debug.Print "t6(1) As Lng", VarPtrArray(t6())
Debug.Print "t7(1) As Int", VarPtrArray(t7())
End Sub
Sub DarkVader4()
Dim myTab1() As Long, myTab2() As Long, nn1 As Long, nn2 As Long
ReDim myTab1(5) As Long
ReDim myTab2(5, 2) As Long
nn1 = Not (Not myTab1())
nn2 = Not (Not myTab2())
Debug.Print "Pointeur NotNot(myTab1()) nn1 : " & Format(nn1, "00 000 000"), "( <>" & VarPtrArray(myTab1()) & ")"
Debug.Print "Pointeur NotNot(myTab2()) nn2 : " & Format(nn2, "00 000 000"), "( <>" & VarPtrArray(myTab2()) & ")"
Dim headerInfos1(1) As Integer, headerInfos2(1) As Integer
' Copier uniquement les données voulues (mais cela pourrait-être l'intégralité d'un safearray)
If nn1 Then GetMem4 nn1, headerInfos1(0)
If nn2 Then GetMem4 nn2, headerInfos2(0)
Debug.Print "Le tableau1 a " & headerInfos1(0) & " dim"
Debug.Print "Le tableau2 a " & headerInfos2(0) & " dim"
End Sub
Sub DarkVader5()
Dim t1(1) As Long, t2(2) As Long, ptr1 As Long, ptr2 As Long, adr1 As Long, adr2 As Long
'Si le pointeur d'un tableau fixe est commun à tous les tableaux,
' chaque tableau fixe est évidemment stocké à une adresse différente (encore heureux).
' Il importe donc de récupérer l'adresse et non le pointeur dans les cas particuliers énumérés précédemment.
ptr1 = VarPtrArray(t1())
ptr2 = VarPtrArray(t2())
GetMem4 ByVal ptr1, adr1
GetMem4 ByVal ptr2, adr2
Debug.Print ptr1, adr1
Debug.Print ptr2, adr2
' UTILISATION CORRECTE
ptr1 = VarPtrArray(t1())
GetMem4 ByVal ptr1, adr1
ptr2 = VarPtrArray(t2())
GetMem4 ByVal ptr2, adr2
Debug.Print ptr1, adr1
Debug.Print ptr2, adr2
End Sub
Sub DarkVader6()
Dim s As String, o As Object, ptrS As Long, ptrO As Long, ptrd As Long, ptrS2 As Long
Dim d As Object, toto As String
toto = "toto"
Set d = CreateObject("Scripting.Dictionary")
ptrS = StrPtr(s)
ptrS2 = StrPtr(toto)
ptrO = ObjPtr(o)
ptrd = ObjPtr(d)
Debug.Print ptrS2, ptrS, ptrO, ptrd
End Sub |
Partager