读书人

送分100分:关于COPYMEMORY和Variant变

发布时间: 2012-01-24 23:11:55 作者: rapoo

送分100分:关于COPYMEMORY和Variant变量数组的问题。
Set VBiaoFanh = Nothing
VBiaoFanh = MSComm1.Input
' Public VBiaoFanh As Variant 接收数据后VBiaoFanh 变为VBiaoFanh(3)的一个BYTE型数组
' VBiaoFanh(0)=138 VBiaoFanh(1)=5 VBiaoFanh(2)= 184 VBiaoFanh(3)=107
现在的任务是取VBiaoFanh(1)和VBiaoFanh(2)到变量HUSHU中,VBiaoFanh(1)是其高位,VBiaoFanh(2)是其低位,取出的值应为1464,而下面的操作中却出现了两个值,一个是根据VBiaoFanh(1)和VBiaoFanh(2)得到的4369,另一个是根据数组c(1)和c(2)得到的数值1464。为什么前者的结果不对。


现在的问题
Dim Hushu As Long
Hushu = 0
Dim c(3) As Byte
c(0) = VBiaoFanh(0) '138
c(1) = VBiaoFanh(1) '5
c(2) = VBiaoFanh(2) '184
c(3) = VBiaoFanh(3) '107
Call CopyMemory(ByVal VarPtr(Hushu), VBiaoFanh(2), 1) ' Hushu =17
Call CopyMemory(ByVal VarPtr(Hushu) + 1, VBiaoFanh(1), 1) ' Hushu =4369 Hushu = 0
Call CopyMemory(ByVal VarPtr(Hushu), c(2), 1) ' Hushu =184
Call CopyMemory(ByVal VarPtr(Hushu) + 1, c(1), 1) ' Hushu =1464

为什么同样的COPYMEMORY的格式,得到的值却不一样。

[解决办法]
VBiaoFanh 作为 Variant 变量,它只能可能成为一个数组,编译时无法确定 VBiaoFanh(2) 的类型,所以该调用是这样实现的:
1) 创建一个临时的 Variant 变量 _Temp
2) _Temp = VBiaoFanh(2)
3) Call CopyMemory(ByVal VarPtr(Hushu), _Temp, 1)
由于运行时 VBiaoFanh(2) 是 Byte 类型,_Temp 的首字节为类型指示 vbByte = 17,所以前两个调用始终只复制了值为 17 的这个字节。

而用 c(2) 调用时,编译时数组是明确的,所以的确复制了数组成员。
[解决办法]

探讨
猜的。

读书人网 >VB

热点推荐