UDT长度的含义是什么?

UDT的长度有两种,一种是写入文件时的长度,一种是实际在内存中的长度。二者肯定是不一样的!

对于定长UDT,一般都是需要其写入文件时的长度。
若所有UDT都是定长的,可用len直接得出,若包含变长内容,如你的xx() as xxx动态数组,或变长String,那就很难了,可能需一个个计算。

因为对于UDT中的动态数组或变长串,Len只返回4个字节,相当于一个32位指针

例如:
Public Type a
   xx As Integer
   xxx As Long
End Type

Public Type b
   xx() As Integer '动态维
   xxx(100) As a
End Type

Public Type c
   xx As a
   xxx As b
End Type

Public ccc As c
ReDim ccc.xxx.xx(10)
Debug.Print Len(ccc)

不管ReDim ccc.xxx.xx(10),还是ReDim ccc.xxx.xx(1000),都会得到
Len(ccc) = 616
的结果

自己看一下Len是怎么算长度的:
类型a长度:Integer+ Long=2+4=6 Byte
类型b长度:Integer()+a(100)=4+101*6=610
类型c长度:a+b=6+610=616

而实际长度:当ReDim ccc.xxx.xx(10)时
ccc的长度=616-4+2*11=634

以上方法,的确很麻烦。而且虽能算出写入文件的长度,但VB能否正常按此长度写入,还说不定!

再说一个推测出的观点,仅供参考:
对于定长UDT,不管多少层嵌套,VB在内存中都是连续存放的,所以VB可用Len直接得出长度,而且可用CpyMemory直接复制结构;

而对于变长内容,VB在连续存放的内容中,只包含一个指向变长内容存放地址的指针,这时VB会无法按计算出的实际长度写入文件,只能按Len的结果写入,所以可能也只是个内存指针,肯定出错。同时CpyMemory也很危险,若按计算出的实际长度Copy,会在后面带上不知预知的内容,若按Len长度Copy,这样又有可能产生两个不同变量指向同一地址的结果。
综上分析,对于变长UDT,因其存放时的不连续性,所以取得其长度,几乎毫无实际利用的意义!所以,VB基于这点,也就不提供计算其长度的方法了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值