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 = 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的格式,得到的值却不一样。
解决方案 »
- datareport 中的 text 控件的宽度 可以自适应 绑定的数据库字段值的大小吗?
- 菜鸟请教一个Test文本输入与Command显示的关联问题?
- 狂送100分(41--access)
- 紧急!容易小问题!如果把一VB对象赋值给long类型变量(帮定对象倒window)
- datalist能显示多字段吗?
- datagrid中的最后一条记录不能保存到SQL中呢
- ........................
- 怎样可以让程序运行时在任务管理器中看不到??在线等待
- 关于FTP协议的一个疑问
- 为什麽我发不了东东???
- VB如何控制其它程序的ACTIVEX控件
- 晕哦````怎么办?如何实现16串口以上的
1) 创建一个临时的 Variant 变量 _Temp
2) _Temp = VBiaoFanh(2)
3) Call CopyMemory(ByVal VarPtr(Hushu), _Temp, 1)
由于运行时 VBiaoFanh(2) 是 Byte 类型,_Temp 的首字节为类型指示 vbByte = 17,所以前两个调用始终只复制了值为 17 的这个字节。而用 c(2) 调用时,编译时数组是明确的,所以的确复制了数组成员。
一、Set VBiaoFanh = Nothing,VBiaoFanh是对象变量还是普通数据变量?
二、Call CopyMemory(ByVal VarPtr(Hushu) + 1, c(1), 1),为什么要偏移一个字节?
需要注意的是,对于VARIANT类型的变量来说,一般不要直接使用CopyMemory,因为VARIANT是一个16字节的结构体,前两字节表示数据类型,后8个字节表示数据变量和指向数据的指针。
当使用Call CopyMemory(ByVal VarPtr(Hushu), VBiaoFanh(2), 1)来复制内容时,其作用是把VARIANT的数据类型(即vt)复制一个字节到Husu中,根本不是复制VBiaoFanh(2)的数据内容。
Set VBiaoFanh = Nothing
Dim c(3) As Byte
c(0) = VBiaoFanh(0) '138
c(1) = VBiaoFanh(1) '5
c(2) = VBiaoFanh(2) '184
可以推断出 VBiaoFanh 是 Variant 类型的变量。Variant类型 变量所引用内存地址的低8字节是类型相关的描述,高8字节是具体的 值 或指针。
在执行 VBiaoFanh = MSComm1.Input 后,VBiaoFanh 已经赋值为一个字节数组。
这时:
VBiaoFanh 的低8字节是 &H 00000000 00002011
VBiaoFanh 的高8字节是 &H 00000000 xxxxxxxx (这里的 xxxxxxxx 是那个 Byte数组 描述符的指针)按 TliVarType 的定义:
Const VT_ARRAY = &H2000
Const VT_UI1 = &H11 (意思可能是:1字节无符号整数)
楼主的两次 CopyMemory :
Call CopyMemory(ByVal VarPtr(Hushu), VBiaoFanh(2), 1) ' Hushu =17
Call CopyMemory(ByVal VarPtr(Hushu) + 1, VBiaoFanh(1), 1) ' Hushu =4369
都是把 VBiaoFanh 的类型描述符的低字节拷到 Hushu 中,所以:
Hushu = &H1111 ,就是十进制的 4369 了。
VBiaoFanh 的确是数组,但是 VBiaoFanh(2) 是数组成员,绝对不会复制 VBiaoFanh 这个 Variant 的。
而是如我1楼所述,用了一个临时的 _Temp 变量。改成这样测试
Call CopyMemory(ByVal VarPtr(Hushu), VBiaoFanh(2), 2) ' Hushu=16401
16401 = &H4011 = VT_UI1 Or VT_BYREF
即 _Temp 是对数组成员的引用,正常的 VB 操作(即 VARIANT 操作)都能按照 VT_BYREF 的指示间接对对数组成员进行存取,可惜 CopyMemory 声明的 Any 类型参数是直接对 _Temp 进行操作的。
' Public VBiaoFanh As Variant 接收数据后VBiaoFanh 变为VBiaoFanh(3)的一个BYTE型数组
' VBiaoFanh(0)=138 VBiaoFanh(1)=5 VBiaoFanh(2)= 184 VBiaoFanh(3)=107
干吗要弄成 Variant类型 的!