?? 數(shù)組一次賦值.txt
字號(hào):
如何給數(shù)組一次性賦值
假設(shè)我要做這樣一個(gè)功能,就是告訴用戶今天是星期幾,一般思路會(huì)是這樣的。
Public Sub GetWeekDay()
Dim aWeekInfo(1 To 7) As String
Dim n As Long
aWeekInfo(1) = "星期日"
aWeekInfo(2) = "星期一"
aWeekInfo(3) = "星期二"
aWeekInfo(4) = "星期三"
aWeekInfo(5) = "星期四"
aWeekInfo(6) = "星期五"
aWeekInfo(7) = "星期六"
n = WeekDay(Now)
MsgBox "今天是" & aWeekInfo(n)
End Sub
看到?jīng)]有,VB里無法象C那樣在定義時(shí)就給數(shù)組賦值,于是只好一個(gè)一個(gè)的給。這里給了例子才7個(gè),如果我還要告訴用戶今年的生肖呢?那么還要定義一個(gè)生肖的數(shù)組,然后給數(shù)組賦值,那是12個(gè)。
那么,我們有沒有辦法給數(shù)組一次性賦多個(gè)值呢?比如這樣賦值:
Call SetArrayData(WeekInfo(), "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六")
答案當(dāng)然是可以的。我們要自己寫個(gè)賦值函數(shù)。
考慮到下面兩個(gè)情況:
1、數(shù)組類型可以是任意的,比如可以是字符串或數(shù)字
2、數(shù)組長度也是未知的。
于是,我們得用到可變參數(shù)。
Public Sub SetArrayData(ParamArray All()) '這里用方法是因?yàn)榭梢圆灰祷刂?
從功能需求上,知道第一個(gè)參數(shù)應(yīng)該是數(shù)組。
Dim aL As Long, aU As Long, aNo As Long
'定義成Long的原因:
'PC上無需在乎這么一點(diǎn)點(diǎn)的內(nèi)存開銷
'在32位的VB中Long的運(yùn)算要比Integer快
dL = LBound(All) '取得數(shù)組的下界,由Option Base 語句控制
dU = UBound(All) '取得數(shù)組的上界
aNo = dL '保存數(shù)組下界
好了,現(xiàn)在我們可以給All(aNo)賦值了:
Dim dL As Long, dU As Long
Dim i as Long '這里的i強(qiáng)烈建議定義成Long,原因同上
dL = dL + 1 'dL要加1,這也是上面為什么要保存到aNo的原因
aL = LBound(All(aNo)) '取得要賦值數(shù)組的下界
aU = UBound(All(aNo)) '取得要賦值數(shù)組的上界
For i = dL To dU
All(aNo)(aL + i - dL) = All(i)
Next i
最后得到賦值方法:
Public Sub SetArrayData(ParamArray All())
Dim aL As Long, aU As Long, aNo As Long
Dim dL As Long, dU As Long
Dim i As Long
dL = LBound(All)
dU = UBound(All)
aNo = dL
aL = LBound(All(aNo))
aU = UBound(All(aNo))
dL = dL + 1
For i = dL To dU
All(aNo)(aL + i - dL) = All(i)
Next i
End Sub
具體應(yīng)用舉例:
Public gSX(0 To 11) As String
Public gWeekInfo(1 To 7) As String
Public gMonthDay(1 To 12) As Long
Public Sub SetData()
Call SetArrayData(gMonthDay(), 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
Call SetArrayData(gSX(), "鼠", "牛", "虎", "兔", "龍", "蛇", "馬", "羊", "猴", "雞", "狗", "豬")
Call SetArrayData(gWeekInfo(), "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六")
End Sub
題后思考:
1、該賦值方法中沒有錯(cuò)誤檢查,比如越界、類型不一致,該如何檢查?
2、如果要賦值的數(shù)組不是從第一個(gè)開始賦,該方法該如何改?
3、為什么不用 Public Sub SetArrayData(ByRef ArrayName(), ParamArray ArrayData()) 或其他的格式呢?
這三個(gè)問題就交給你去考慮了。
我的結(jié)論:
VB看起來很簡單,但它能實(shí)現(xiàn)的功能可以不簡單。不要因?yàn)閂B不能賦初值就說C好,VB有VB的方法:)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -