【怪问题】将整个数组赋值给一个变体变量本帖最后由 JiLuoXingRen 于 2012-11-24 02:07:01 编辑Dim a(2) As
【怪问题】将整个数组赋值给一个变体变量
本帖最后由 JiLuoXingRen 于 2012-11-24 02:07:01 编辑
Dim a(2) As Byte
Private Sub Form_Load()
a(0) = 1
a(1) = 2
a(2) = 3
Call b(a)
End Sub
Public Sub b(c As Variant)
stop
End Sub
代码非常简单。可能有人会说我的代码是错的,我知道,故意的。在上面的代码里,我将数组a作为传递给子程序b的实参传了进去,而b的形参c只是一个普通的变量。其实如果确实是要将数组作为参数,可以这样写代码:
Dim a(2) As Byte
Private Sub Form_Load()
a(0) = 1
a(1) = 2
a(2) = 3
Call b(a)
End Sub
Public Sub b(ParamArray c())
stop
End Sub
我本以为上面那段代码会编译出错,可是不会,只是传了数组a的实参c变成了不知道什么东西。
我想知道的是:
①在这样的赋值过程中,原来的数组a做了什么转化才赋值给了c?
②在这个转化中,其内存数据又是做了什么变化?
③按照这样,现在的实参c还能还原出数组a的全部数据吗?
额外问一下,如果一个函数的返回值是一个数组,那怎么声明函数
[最优解释]Call b(a)
此处,传人到b中的是,实参a的转换为一个变体后的地址(该变体是一个不可见的临时变量)
a中的数据除穿上一件外衣(转换为变体)外,数据还是原来的数据
在b中,当然能完全恢复a原来的数据
比如:b中
sub b(c)
dim z() as byte
z=c
end sub
[其他解释]发现一个问题,就用你给出的变量来说吧。如果我对Z的声明是
dim z() as Variant
就发现数据读不出来了,Variant不是通杀的吗?为什么这样声明却没办法读出来?
[其他解释]返回数组的函数要这样定义:
Option Explicit
Dim a(2) As Byte
Private Sub Form_Load()
a(0) = 1
a(1) = 2
a(2) = 3
Dim c() As Byte
Dim i As Long
c = b(a)
For i = 0 To UBound(c)
Debug.Print c(i)
Next
End Sub
Public Function b(c() As Byte) As Byte()
b = c
End Function
[其他解释]这样也行:
Option Explicit
Dim a(2) As Byte
Private Sub Form_Load()
a(0) = 1
a(1) = 2
a(2) = 3
Dim c() As Byte
Dim i As Long
c = b(a)
For i = 0 To UBound(c)
Debug.Print c(i)
Next
End Sub
Public Function b(c As Variant) As Byte()
b = c
End Function
[其他解释]
你为什么要在b中定义 dim z() as variant
这个定义将z中的每个元素都将认为是Variant,但是,你传人是数组的每个元素是byte,对于数组的元素,VB似乎没有进行默认转换
可以按下面编写代码
Public Sub bb(c As Variant)
Dim z() As Variant
Dim i As Long
i = UBound(c)
ReDim z(i)
For i = 0 To UBound(z)
z(i) = c(i)
Debug.Print c(i)
Next
End Sub
[其他解释]对了msdn上好像有说,对于直接给数组赋值,左右数组的数据类型必须相同,同时,左值必须为可变长数组
[其他解释]哦~~??在哪??让我也看看~
[其他解释]其实问题已经解决了,只不过学就要学通学透,所以多问一下为什么不行~