我在VBA(Excel)中具有用户定义的类型,并且希望为成员提供固定的内存布局,以便在以后的步骤中可以使用指针访问那些成员。
用户定义的类型看起来像提供的代码,我需要将成员的地址传递给其他程序。
我希望VBA按照初始化成员的顺序来构造成员,但是不知何故。
如果您对解决该问题有任何想法,我将不胜感激!
最好的问候, 拉斯
Public Type ExampleSet
Example_P_Anteil As Single
Example_I_Anteil As Single
Example_D_Anteil As Single
Example_v0 As Double
Example_Gang0 As Integer
Example_Beschleunigung As Double
Example_Startzeit As Double
Example_int1 As Integer
Example_int2 As Integer
Example_int3 As Integer
End Type
答案 0 :(得分:3)
我挑战你的结论。
Public Type TestUDT
SomeInteger As Integer ' Int16 (I2) at offset 0, padded with 2 bytes
SomeLong As Long ' Int32 (I4) at offset 4, no padding
AnotherLong As Long ' Int32 (I4) at offset 8, no padding
End Type
Public Sub test()
Dim udt As TestUDT
Debug.Print VarPtr(udt) 'expected: X
Debug.Print VarPtr(udt.SomeInteger) 'expected: X+0
Debug.Print VarPtr(udt.SomeLong) 'expected: X+4
Debug.Print VarPtr(udt.AnotherLong) 'expected: X+8
End Sub
输出符合预期:
723094616
723094616
723094620
723094624
用户定义类型(UDT)在语言规范中定义为:
聚合数据值的线性级联,可能在数据值之间使用实现定义的填充。
填充可能会让您失望,但UDT仍然是其成员的线性串联。
使用LenB
函数来确定成员(或整个UDT)的长度:
Dim foo As ExampleSet
Debug.Print VarPtr(foo), LenB(foo)
如果UDT包含字符串,则需要固定其长度的成员的偏移量,将它们定义为固定长度:
Public Type TestUDT
SomeString As String * 10
'...
End Type
也就是说,祝您访问这些指针的过程顺利。