數組是有序資料的集合。數組中的元素可以不屬於同一個資料類型。用一個統一的數組名和下標來唯一地確定數組中的元素,更改其中一個元素並不會影響其它元素。數組的下標是有界的,分為下界和上界。數組可以用Dim、Private、Public或Static來聲明,它們的文法格式相同。下面只介紹用Dim聲明數組的方法。
1.數組的定義與聲明
數組的定義文法如下:
Dim 數組名( [[下標下界 To ] 下標上界] ) [As 資料類型]
例如(假設在當前模組中 數組的預設下界為0)):
① Dim A(10) As Integer
表示數組名為A,此數組下標下界為預設值0,下標上界為10,有11個Integer類型的元素,從A(0)、A(1)到A(10)。
② Dim B(1 To 20) As Integer
表示數組名為B,此數組下標下界為1,下標上界為20,有20個Integer類型的元素,從B(1)到B(20)。
③Dim DayArray(50)
表示DayArray 是一個有 51 個索引(從 0 到 50)元素的 Variant 數組。
④Dim Matrix(3, 4) As Integer
表示Matrix 是一個二維 Integer 數組。
⑤Dim MyMatrix(1 To 5, 4 To 9, 3 To 5) As Double
表示MyMatrix 是一個顯式指定了上下界的三維 double 數組。
⑥Dim BirthDay(1 To 10) As Date
表示BirthDay 是一個索引從 1 到 10 的 Date型 數組。
2.Option Base 語句
Option Base 語句在模組層級別中使用,用來聲明數組下標的預設下界。
Option Base 語句的文法如下:
Option Base {0 | 1}
說明:預設狀態下數組下界為 0,此時無需使用 Option Base 語句。如果使用該語句規定數組下界1,則必須在模組的數組聲明之前使用Option Base 語句。
注意:
(1)Dim、Private、Public、ReDim 以及 Static 語句中的 To 子句提供了一種更靈活的方式來控制數組的下標。不過,如果沒有使用 To 子句顯式地指定下界,則可以使用 Option Base 將預設下界設為 1。使用 Array 函數建立的數組的下界也受 Option Base 語句指定的下界的決定, 除非 Array 是由類型庫(例如 VBA.Array )名稱限定,如果是由類型庫名稱限定,則 使用Array 函數建立的數組的下界不受 Option Base 的影響。
(2) Option Base 語句隻影響位於包含該語句的模組中的數組下界。
關於數組聲明的幾點說明:
①數組名命名規則和變數名的相同。
②數組名後是用圓括弧括起來的,不能用方括弧,不同於C語言。
③下標的下界必須不能大於其上界。
④可以用變數名或常數名(以及實數)作下標的邊界。當下標的邊界是常數名時,數組的大小固定,當下標的邊界是變數名時,數組的大小可作動態定義,即數組的大小取決於程式運行過程中變數的值。因此,VB 中數組又可以分為兩種數組:靜態數組、動態數組。
3.靜態數組
靜態數組是指數組元素的個數是固定不變的,即它們佔用的記憶體空間大小是固定不變的。根據固定大小數組的維數不同,可以將它分為一維數組和多維陣列。
聲明多維陣列的文法格式為:
Dim 數組名([下標邊界列表]) [As 資料類型]
下標邊界的定義形式:[下標下界 To]下標上界
下標邊界列表指用逗號分開的數組各維的下標邊界,即
[下標下界 To]下標上界,[下標下界 To]下標上界,……,[下標下界 To]下標上界
(第一維) (第二維) (第n維)
當n=1時,數組稱作一維數組;當n=2時,數組稱作二維數組;依次類推,當n=m時,數組稱作m維數組。
下面舉例介紹一維數組的使用。
'聲明一個長度為51的字串數組FriendsName
Dim FriendsName(50) As String
'聲明一個長度為11的全域整型數組Class
Public Class(10) As Integer
一維數組中的元素個數為(上界-下界+1)。
為數組賦初值可以採用迴圈語句,如:
Dim I As Integer
For I = 0 To 11 '迴圈語句的使用程式流程的控制
C(I) = I
Next I
如果不顯式指定下標下界,則數組的下標下界由 Option Base 語句控制。如果沒有 Option Base 語句則下界為預設為 0。
數組的維數並不限於2,在VB中,可以擴大至於60,在實際應用上對三維以上的數組的應用是不多的。定義一個多維陣列時只需一條Dim語句指定數組的所有下標邊界即可,使用多維陣列的可以很方便的表示一些有意義的統計資料。例如:
Dim Profit(16,10,12) As Currency
這個Profit數組可用來表示以店名、部門及月份為參數的某百貨公司的利潤。如:Profit(2,8,11)代表了第二分店的第八部門在11月份的利潤。
4.動態數組
有時在數組開始使用前,不能知道需要多大的數組才能滿足實際需要。當然可以把數組的大小定義到足夠大來滿足任意的實際應用需要,這種方法效率很低(大量浪費記憶體空間)。如果使用動態數組,就可以在程式運行時根據實際需要,精確定義數組的大小。
在聲明數組時,不給出維數列表就是將數組聲明為動態數組。例如:
Dim MyArry() As Integer
在使用動態數組前,必須使用ReDim語句把它重新定義。如前面聲明的數組MyArry,可以用以下語句將它定義為一個動態二維數組。
ReDim MyArry(10,10)
還可以通過重複執行ReDim語句,多次定義動態數組。使用ReDim最多能定義數組的維數是60。ReDim語句可以改變數組每維的元素個數,但不能改變維數。下面是對ReDim語句的一個標準應用程式舉例。
Dim MyArry() As Single ‘聲明動態數組
ReDim MyArry(30,20,10) ‘重新定義數組
ReDim MyArry(50,23,21) ‘再次重新定義數組
ReDim的文法與Dim的相同,此外,它還有選擇項Preserve關鍵詞:
ReDim Preserve 數組名 ([ [下標下界 To]下標上界]) [As 資料類型]
例如:
ReDim MyArry(50,23,21)ReDim Preserve MyArry(50,23,50)
注意:使用ReDim 時,重新定義數組會使所有數組元素的值消失,而使用Preserve可以保留資料。但是用Preserve只能在改變數組的最後一維的大小時,保留數組的資料。對於一維數組來說,所有資料都會保留,而對於多維陣列:只能改變最後一維的大小,才能保留全部數組資料,否則出錯。
5.LBound 函數和UBound 函數
LBound 函數和Ubound函數都是返回一個 Long 型資料,前者得到的值為指定數組維可用的最小下標,而後者得到的是最大下標。它們的文法為:
LBound(數組名[, 指定的維數])
UBound(數組名[, 指定的維數])
其中數組名是必選的。指定的維數是可選的,表明指定返回哪一維的下界。1 表示第一維,2 表示第二維,如此類推。如果省略指定的維數,就預設為是 1。
關於如何使用LBound 函數與 UBound 函數可參見下例:
Dim A(1 to 100,3,-3 to 4) As Integer '定義一三維數組,假定沒有使用Option Base 語句改變數組下界的預設值。
對數組A使用Lbound 和Ubound函數,其傳回值列表如下
所有維的預設下界取決於 Option Base 語句的設定。可以看出對一數組使用LBound 函數與 UBound 函數,可用於確定一個數組中元素的個數。
對於那些在聲明中用 To 子句來設定維數的數組而言,它們可以用任何整數作為下界而不受Option Base 語句的限制。
6.數組的進階功能
儘管數組最通常被用來儲存成組的變數,但是在別的一些方面數組也是很有用的。可以將一個數組的內容賦值給另一個數組、建立返回數組的函數,還可以建立返回數組的屬性。在許多情況下,這些技術能改進應用程式的效能。
正如可以將一個變數的值賦給另一個變數,例如 StrA = StrB ,也可以將一個數組的內容賦給另一個數組。例如,要將一位元組型數組從一個位置複製到另一個位置。可以通過每次複製一個位元組來實現,程式如下:
Sub ByteCopy(oldCopy() As Byte, newCopy() As Byte)‘參數oldCopy()是源數組,newCopy()是目標數組Dim i As IntegerReDim newCopy (Lbound(oldCopy) To UBound(oldCopy)) '重新定義動態數組For i = Lbound(oldCopy) To Ubound(oldCopy) '迴圈賦值newCopy(i) = oldCopy(i)NextEnd Sub
一個更有效簡單的方法就是直接將一個數組賦給另外一個數組:
Sub ByteCopy(oldCopy() As Byte, newCopy() As Byte)‘參數oldCopy()是源數組,newCopy()是目標數組newCopy = oldCopy '利用數組直接進行賦值End Sub
關於變數賦值有一些規則需要銘記。例如,雖然可以將一個聲明為整型的變數賦給一個聲明為長整型的變數而不會產生任何問題,但是將一個長整型變數賦給一個整型變數就很容易導致溢出錯誤。除了遵守有關資料類型變數之間賦值時的規則外,數組賦值還要遵從另外一些規則,包括數組維數,每一維的大小,以及數組是固定的還是動態。
①維數、資料類型不同的數組賦值考慮的幾個因素
1、 賦值符左邊的數群組類型:固定數組 (Dim x(1 to 10) As Integer) 或者動態數組 (Dim x() As Integer)。
2、賦值符左邊數組的維數是否和賦值符右邊數組的維數匹配。
3、 賦值符兩邊數組的每一維的數組元素個數是否匹配。即使數組的聲明不同,維數也可能匹配。比如一個數組的每一維元素從 0 開始編號而另一個則從 1 開始,維數也可能匹配。
4、 賦值符兩邊所有元素的資料類型必須是相容的。這些規則和變數賦值的規則是一致的。
數組賦值時的錯誤可能發生在編譯時間,也可能發生在運行時(例如,如果資料類型不能強制轉換或賦值試圖重新聲明 (ReDim) 一個靜態數組)。設計程式時要添加錯誤處理以確保數組在賦值之前是匹配的。
②編寫返回數組的函數
從一個函數返回一組值是可能實現的。例如,從一個函數返回一組位元組而不必將其先轉換為一個字串然後再轉換回來。
下面是一個使用返回位元組數組的函數的簡單樣本:
Private Sub Form_Load()Dim b As ByteDim i As IntegerDim ReturnArray() As Byteb = Cbyte(54)ReturnArray() = ArrayFunction(b) '調用函數For i = Lbound(ReturnArray) To Ubound(ReturnArray)Msgbox ReturnArray(i) '通過彈出訊息框迴圈顯示數組值 NextEnd SubPublic Function ArrayFunction(b As Byte) As Byte()Dim x(2) As Bytex(0) = bx(1) = b + CByte(200)x(2) = b + bArrayFunction = x '返回結果為數組xEnd Function
在運行以上樣本後, ReturnArray() 是一個三元素數組,其中包含了分配給 ArrayFunction 中數組的值。ArrayFunction 語句將一個數組作為參數傳遞;且數組的資料類型必須和函數的資料類型相同(在本例中是位元組)。因為這是一個函數調用,傳遞數組時不必帶括弧。
注意:
1、儘管可以通過賦值給另一個數組(ArrayFunction = x())來返回一個數組,但出於效能方面的考慮,並不推薦使用這種方法。
2、必須為返回數組的函數指定一個類型,這個類型可以是 Variant。這樣一來,Function X() As Variant() 是有效而 Function X() As () 將失敗。
3、當調用一個返回數組的函數時,用來儲存傳回值的變數也必須是一個數組,而且其資料類型必須和函數傳回型別相同,否則將顯示一個“類型不符”的錯誤。
以上就是小編和大家分享的ASP定義數組的方法,感興趣的小夥伴們可以來參考一下