首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

【怪有关问题】将整个数组赋值给一个变体变量

2012-12-16 
【怪问题】将整个数组赋值给一个变体变量本帖最后由 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

[其他解释]
引用:
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

[其他解释]

引用:
引用:
Call b(a) 

此处,传人到b中的是,实参a的转换为一个变体后的地址(该变体是一个不可见的临时变量)
a中的数据除穿上一件外衣(转换为变体)外,数据还是原来的数据
在b中,当然能完全恢复a原来的数据

比如:b中
sub b(c)
dim z() as byte
z=c
end sub
发现一个问题,就用你给出的变量来说吧。如果……


你为什么要在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上好像有说,对于直接给数组赋值,左右数组的数据类型必须相同,同时,左值必须为可变长数组
[其他解释]
引用:
对了msdn上好像有说,对于直接给数组赋值,左右数组的数据类型必须相同,同时,左值必须为可变长数组

哦~~??在哪??让我也看看~
[其他解释]
引用:
你为什么要在b中定义 dim z() as variant

其实问题已经解决了,只不过学就要学通学透,所以多问一下为什么不行~

热点排行