当前位置:首页 > 数码 >

sa5068如何连接蓝牙耳机(sa9106怎么连接蓝牙)

来源:原点资讯(www.yd166.com)时间:2023-10-29 12:08:33作者:YD166手机阅读>>

1、VBA数组底层结构:

VBA的数组在底层是SafeArray:

'https://docs.microsoft.com/zh-cn/windows/win32/api/oaidl/ns-oaidl-safearraybound?redirectedfrom=MSDN TypeSafeArrayBound cElements As Long '// 该维的长度 lLbound As Long ' // 该维的数组存取的下限,一般为0 End Type 'https://docs.microsoft.com/zh-cn/windows/win32/api/oaidl/ns-oaidl-safearray?redirectedfrom=MSDN Type SafeArray cDims As Integer ' // 数组的维度 fFeatures As Integer ' cbElements As Long ' // 数组元素的字节大小 cLocksas As Long ' pvDataas As Long ' // 数组的数据指针 rgsabound(0)AsSafeArrayBound End Type

如果要取数组的地址,需要用到API函数:

Public Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Var() As Any) As Long

VarPtrArray 返回的并不是SafeArray的地址,我们可以进行测试:

Sub TestArray() Dim Arr() As byte ReDim Arr(3) As Byte Dim sa As SafeArray CopyMemory VarPtr(sa), VarPtrArray(Arr), Len(sa) Printf "sa.cDims = %d, sa.cbElements = %d", sa.cDims, sa.cbElements End Sub 输出: sa.cDims = -27936, sa.cbElements = 3994212

从输出可以看出,我们预计的sa.cDims应该=1和sa.cbElements=1并没有出现,显然VarPtrArray(Arr)获取到的还不是Arr的地址。

像c语言这样的语言,是有指针的,VBA数组的底层实现应该是使用了一个指针来引用SafeArray结构,而VarPtrArray(Arr)获取到的应该是指针的地址。

Sub TestArray() Dim Arr() As Byte ReDim Arr(3) As Byte Dim ptr As Long '保存[Arr指针]的地址 CopyMemory VarPtr(ptr), VarPtrArray(Arr), 4 Dim sa As SafeArray CopyMemory VarPtr(sa), ptr, Len(sa) Printf "sa.cDims = %d, sa.cbElements = %d", sa.cDims, sa.cbElements End Sub 输出 sa.cDims = 1, sa.cbElements = 1

从输出可以看出,预计的sa.cDims应该=1和sa.cbElements=1出现了。

进一步测试,从pvDataas 中提取数据,看看获取的数据是否能正确:

Sub TestArray2() Dim Arr() As Byte ReDim Arr(3) As Byte Dim ptr As Long '保存[Arr指针]的地址 Arr(0) = &H88 Arr(1) = &H21 Arr(2) = &H27 Arr(3) = &H99 CopyMemory VarPtr(ptr), VarPtrArray(Arr), 4 Dim sa As SafeArray CopyMemory VarPtr(sa), ptr, Len(sa) Dim b(3) As Byte Dim i As Long For i = 0 To 3 CopyMemory VarPtr(b(i)), sa.pvDataas sa.cbElements * i, sa.cbElements Printf "b(%d) = 0x%x ", i, b(i) Next End Sub 输出: b(0) = 0x88 b(1) = 0x21 b(2) = 0x27 b(3) = 0x99

完全正确。

2、改变SafeArraypvDataas地址会有什么情况:

既然知道了数组的内存结构,那我们就尝试把pvDataas改变看看会怎么样:

Sub TestArray2() Dim Arr() As Byte ReDim Arr(0) As Byte Dim ptr As Long '保存[Arr指针]的地址 CopyMemory VarPtr(ptr), VarPtrArray(Arr), 4 Dim lValue As Long lValue = &HABCDEF99 Dim plValue As Long plValue = VarPtr(lValue) '修改pvDataas指向lValue CopyMemory ptr 12, VarPtr(plValue), 4 '修改Arr的SafeArrayBound为4 Dim cElements As Long cElements = 4 CopyMemory ptr 16, VarPtr(cElements), 4 Dim sa As SafeArray CopyMemory VarPtr(sa), ptr, Len(sa) Printf "sa.pvDataas = 0x%x, plValue = 0x%x", sa.pvDataas, plValue Dim i As Long For i = 0 To 3 Printf "Arr(%d) = 0x%x ", i, Arr(i) Next End Sub 输出: sa.pvDataas = 0x36ecbc, plValue = 0x36ecbc Arr(0) = 0x99 Arr(1) = 0xef Arr(2) = 0xcd Arr(3)=0xab

定义了一个容量为1的byte数组,但是我把pvDataas的值修改成了1个Long变量的地址,同时也改变了他的SafeArrayBound为4,从输出可以看到,这个数组已经变成了一个容量为4的byte数组。

但是End Sub后,我的电脑测试Excel崩溃,这个和前面讲到的String类型里的情况差不多,到底是什么原因?

3、ReDim Preserve做了什么

我们经常会用ReDim Preserve来改变数组的容量,当然一般都是扩大。扩大的话要更多的内存空间来保存数据,所以应该是要重新分配内存,测试:

Sub TestArray() Dim Arr() As Byte ReDim Arr(3) As Byte Dim ptr As Long '保存[Arr指针]的地址 Dim sa As SafeArray CopyMemory VarPtr(ptr), VarPtrArray(Arr), 4 CopyMemory VarPtr(sa), ptr, Len(sa) Printf "ptr = 0x%x, sa.pvDataas= 0x%x, sa.cDims = %d, sa.cbElements = %d, sa.rgsabound(0).cElements = %d", ptr, sa.pvDataas, sa.cDims, sa.cbElements, sa.rgsabound(0).cElements ReDim Preserve Arr(4) As Byte CopyMemory VarPtr(ptr), VarPtrArray(Arr), 4 CopyMemory VarPtr(sa), ptr, Len(sa) Printf "ptr = 0x%x, sa.pvDataas= 0x%x, sa.cDims = %d, sa.cbElements = %d, sa.rgsabound(0).cElements = %d", ptr, sa.pvDataas, sa.cDims, sa.cbElements, sa.rgsabound(0).cElements End Sub 输出: ptr = 0x16597108, sa.pvDataas= 0x167c3a40, sa.cDims = 1, sa.cbElements = 1, sa.rgsabound(0).cElements = 4 ptr = 0x16597108, sa.pvDataas= 0x167c3790, sa.cDims = 1, sa.cbElements = 1, sa.rgsabound(0).cElements = 5

pvDataas已经改变,重新分配了内存空间。

但是,如果是减小呢?

我本来猜测只要修改sa.rgsabound(0).cElements的值就可以达到减小容量的目的,可测试却同样重新分配了内存:

Sub TestArray() Dim Arr() As Byte ReDim Arr(3) As Byte Dim ptr As Long '保存[Arr指针]的地址 Dim sa As SafeArray CopyMemory VarPtr(ptr), VarPtrArray(Arr), 4 CopyMemory VarPtr(sa), ptr, Len(sa) Printf "ptr = 0x%x, sa.pvDataas= 0x%x, sa.cDims = %d, sa.cbElements = %d, sa.rgsabound(0).cElements = %d", ptr, sa.pvDataas, sa.cDims, sa.cbElements, sa.rgsabound(0).cElements ReDim Preserve Arr(1) As Byte CopyMemory VarPtr(ptr), VarPtrArray(Arr), 4 CopyMemory VarPtr(sa), ptr, Len(sa) Printf "ptr = 0x%x, sa.pvDataas= 0x%x, sa.cDims = %d, sa.cbElements = %d, sa.rgsabound(0).cElements = %d", ptr, sa.pvDataas, sa.cDims, sa.cbElements, sa.rgsabound(0).cElements End Sub 输出: ptr = 0x167d5068, sa.pvDataas= 0x167c3a50, sa.cDims = 1, sa.cbElements = 1, sa.rgsabound(0).cElements = 4 ptr = 0x167d5068, sa.pvDataas= 0x167c37f0, sa.cDims = 1, sa.cbElements = 1, sa.rgsabound(0).cElements = 2

本文使用 文章同步助手 同步,关注xyjvba,查看更多

栏目热文

em901双模鼠标怎么连接蓝牙(黑色em901双模游戏鼠标使用说明)

em901双模鼠标怎么连接蓝牙(黑色em901双模游戏鼠标使用说明)

达尔优EM901双模无线游戏鼠标618限时特惠。选取全新的配色方案与个性元素;采用2.4G无线与蓝牙5.0的双无线连接模...

2023-10-29 12:08:05查看全文 >>

歌杰仕b900怎么连接蓝牙(莱仕达p50怎么连接手机蓝牙)

歌杰仕b900怎么连接蓝牙(莱仕达p50怎么连接手机蓝牙)

从世界第一款音响被发明至今,人们在声学的追求道路上似乎从未止步,享受好音乐,追求卓越生活。我们可以在音乐中感悟人生,提高...

2023-10-29 11:34:35查看全文 >>

ga110怎么连接蓝牙(ga110黑金能不能连接蓝牙)

ga110怎么连接蓝牙(ga110黑金能不能连接蓝牙)

众所周知G-SHOCK因为其耐用的品质,让这个系列的手表深受年轻人喜爱。接下来小编就接着上一篇辨别真假的文章继续介绍。附...

2023-10-29 12:10:56查看全文 >>

s900声卡怎么连不上蓝牙(声卡s08怎么连接蓝牙)

s900声卡怎么连不上蓝牙(声卡s08怎么连接蓝牙)

近日我们三易生活的同事在网上闲逛时,无意中看到了这样一张产品宣传图片。老实说,如果你是一位最近这两年才开始关注消费电子行...

2023-10-29 12:20:15查看全文 >>

凯迪仕s110怎么连蓝牙(凯迪仕智能锁s110怎么打开蓝牙)

凯迪仕s110怎么连蓝牙(凯迪仕智能锁s110怎么打开蓝牙)

废话不说,直接上图!凯迪仕智能锁S100淘宝店仅售1199!该款智能锁目前在淘宝(格罗克)店铺销售,据了解,格罗克是凯迪...

2023-10-29 12:06:38查看全文 >>

sa729怎么连蓝牙(s911蓝牙耳机使用方法图解)

sa729怎么连蓝牙(s911蓝牙耳机使用方法图解)

支持安卓8.0纯音编码格式的蓝牙耳机推荐传统的有线耳机时代,好音质是手机和耳机合力的结果。换成蓝牙耳机后,虽然手机和耳机...

2023-10-29 11:57:45查看全文 >>

备份的数据库怎么添加到其他电脑(想把数据库备份到本地怎么弄)

备份的数据库怎么添加到其他电脑(想把数据库备份到本地怎么弄)

SAP是一款功能强大的企业资源计划(ERP)软件,许多企业依赖SAP来管理和处理其核心业务数据。然而,有时候企业需要将S...

2023-10-29 12:20:11查看全文 >>

不同电脑上的数据库备份怎么恢复(电脑上备份的数据库文件怎么打开)

不同电脑上的数据库备份怎么恢复(电脑上备份的数据库文件怎么打开)

在现代生活中,我们的电脑中存储着大量重要的文件和数据。然而,电脑硬件可能会损坏,文件可能会被误删除或感染病毒等情况,因此...

2023-10-29 12:17:24查看全文 >>

电脑如何把数据备份到另一台机器(电脑备份数据还原到另外一个电脑)

电脑如何把数据备份到另一台机器(电脑备份数据还原到另外一个电脑)

电脑更换如何迁移数据?许多小伙伴在办公的时候,都会有这个问题。大部分办公人士会选择共享文件夹来传输文件,但是对于一些小白...

2023-10-29 11:49:12查看全文 >>

数据库如何备份到另一台机器(数据库数据怎么做备份)

数据库如何备份到另一台机器(数据库数据怎么做备份)

一、Xtrabackup介绍  MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实...

2023-10-29 12:02:28查看全文 >>

文档排行