asp定义数组详解

上一篇 / 下一篇  2007-03-31 14:01:15 / 个人分类:ASP

51Testing软件测试网"\S!_Ji0k

数组是有序数据的集合。数组中的元素可以不属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素,更改其中一个元素并不会影响其它元素。数组的下标是有界的,分为下界和上界。数组可以用Dim、Private、Public或Static来声明,它们的语法格式相同。下面只介绍用Dim声明数组的方法。51Testing软件测试网X?ZK4x(T.d ?li

51Testing软件测试网e W7m"Pg;s*KI.L&^

1.数组的定义与声明 51Testing软件测试网4b*upjkEj(V2p
数组的定义语法如下:51Testing软件测试网+m#w{*bS4D"U

51Testing软件测试网U$T4}q6g1]

Dim 数组名( [[下标下界 To ]  下标上界] )  [As 数据类型]51Testing软件测试网W6c+hr3zl C'a

51Testing软件测试网4~cXJvq Ex

例如(假设在当前模块中 数组的缺省下界为0)):

.CS$g{5~8p2G KT0

1l6L i|.~0       ①    Dim  A(10)  As  Integer51Testing软件测试网7JvDC"u(I1h,v

@'p"R0W1y'K6c0       表示数组名为A,此数组下标下界为缺省值0,下标上界为10,有11个Integer类型的元素,从A(0)、A(1)到A(10)。

x&n5yj\0

9`!kO&[y:gH5Er O0       ②    Dim  B(1 To 20)  As  Integer

1s!ve+P$Bj$f,\s0

j)bQVvo(c0       表示数组名为B,此数组下标下界为1,下标上界为20,有20个Integer类型的元素,从B(1)到B(20)。51Testing软件测试网 T LFB(M z

51Testing软件测试网0c5_$h,yVk-g

③Dim DayArray(50)51Testing软件测试网A M2t)DPS

/x7j'R,NVX0表示DayArray 是一个有 51 个索引(从 0 到 50)元素的 Variant 数组。

f2q!m3u\)_'iB4C0 51Testing软件测试网 c6f2Q/Zc ^4u

④Dim Matrix(3, 4) As Integer

\u O t/Cjj0n0 51Testing软件测试网^-_!Au.{m)ZL

表示Matrix 是一个二维 Integer 数组。

QNw7z u~9P0 51Testing软件测试网(aGT OR;X#T

⑤Dim MyMatrix(1 To 5,  4 To 9,  3 To 5) As Double51Testing软件测试网nX}/E}b

51Testing软件测试网g} B,W|3xGj~ K

表示MyMatrix 是一个显式指定了上下界的三维 double 数组。51Testing软件测试网q3@|:hLyM9P0a3_

51Testing软件测试网c,I1nm-v

⑥Dim BirthDay(1 To 10) As Date51Testing软件测试网-Q(Vn|/xH/},Q [#]

*e6TgQ g7~u6N7^0表示BirthDay 是一个索引从 1 到 10 的 Date型 数组。

(jb H/N%k ` B9pB}0

i)s Jay02.Option Base 语句 51Testing软件测试网9_5Y"he G1z
Option Base 语句在模块级别中使用,用来声明数组下标的缺省下界。51Testing软件测试网+I8D2AJG ?M{Kh

51Testing软件测试网1g+r3Cy,H

Option Base 语句的语法如下:51Testing软件测试网 XxnKQ#r#bg

m,vlI$e#x_0Option Base {0 | 1}51Testing软件测试网7Y&W:c4cw&c\7c

K`c4E x1n&MO0  说明:缺省状态下数组下界为 0,此时无需使用 Option Base 语句。如果使用该语句规定数组下界1,则必须在模块的数组声明之前使用Option Base 语句。

^G1B:D5x0

-n%^rr } h0  

&D,x,iyH#wP0

Td yMf"u!]INW0注意:

7]Q(j;d'\b0M)L LJ0 51Testing软件测试网B;C1O?~O.n/C1Wp

(1)Dim、Private、Public、ReDim 以及 Static 语句中的 To 子句提供了一种更灵活的方式来控制数组的下标。不过,如果没有使用 To 子句显式地指定下界,则可以使用 Option Base 将缺省下界设为 1。使用 Array 函数创建的数组的下界也受 Option Base 语句指定的下界的决定, 除非 Array 是由类型库(例如 VBA.Array )名称限定,如果是由类型库名称限定,则 使用Array 函数创建的数组的下界不受 Option Base 的影响。 51Testing软件测试网p/b&]lyg%F2F

51Testing软件测试网 u^ }U8\?{

(1)    Option Base 语句只影响位于包含该语句的模块中的数组下界。

xok6Y$qFA:j%S0

nZd!V$Am0  51Testing软件测试网 ym h;{kZ|-L.Z3Y

51Testing软件测试网FQ'g%_#XfZ2a&Kb^

关于数组声明的几点说明:

S'W'L;~f9Vho9qe0

*s;hV}4D \:a0①数组名命名规则和变量名的相同。51Testing软件测试网|0nR)vLI2M

51Testing软件测试网9P u;^v frD1H

②数组名后是用圆括弧括起来的,不能用方括弧,不同于C语言。

Y2V3e|0h0 51Testing软件测试网kp6GA Kxk4q'D

③下标的下界必须不能大于其上界。

cvdX0b4Vd0

A c4Z2O#b#{+h"J0④可以用变量名或常数名(以及实数)作下标的边界。当下标的边界是常数名时,数组的大小固定,当下标的边界是变量名时,数组的大小可作动态定义,即数组的大小取决于程序运行过程中变量的值。因此,VB 中数组又可以分为两种数组:静态数组、动态数组。51Testing软件测试网&b` LT{3D2F"U}A

51Testing软件测试网$` T1[(T2}/NTOu5d

3.静态数组
YHS}w5Y5L0静态数组是指数组元素的个数是固定不变的,即它们占用的内存空间大小是固定不变的。根据固定大小数组的维数不同,可以将它分为一维数组和多维数组。51Testing软件测试网.p.}v1{4g,_2Tb [Ts

4b2LUqO"p2d0声明多维数组的语法格式为:51Testing软件测试网 V}.z6lT

51Testing软件测试网dn y[9mz }

       Dim  数组名([下标边界列表])  [As  数据类型]

.^mw~vQ7L!a^0

ZJ8@_F \2u^(M"x$D0下标边界的定义形式:[下标下界 To]下标上界51Testing软件测试网 U ZQBIIXl

] rw@U8~%dE0下标边界列表指用逗号分开的数组各维的下标边界,即51Testing软件测试网H"[Z^`YN+a

ym*`T ]X8S0[下标下界 To]下标上界,[下标下界 To]下标上界,……,[下标下界 To]下标上界

S1G ] F R&^$?"E4V9L0

?}x eH;ef!u:w[G X9Z0(第一维)              (第二维)                   (第n维)

_ @2p5j$j&Y}T[0 51Testing软件测试网p9i.WA(Xni

当n=1时,数组称作一维数组;当n=2时,数组称作二维数组;依次类推,当n=m时,数组称作m维数组。

](s6[*cJ'Dg&Rk+[ A?0 51Testing软件测试网Z+S0B.l2Q{9V5v

下面举例介绍一维数组的使用。

G |L(c5v/n6[yH\0

$m)Ee!j-o8v E$V:NJ w0’声明一个长度为51的字符串数组FriendsName51Testing软件测试网lc S4M6[q({r)hK

#sw.X5GD6c.E0Dim FriendsName(50) As String51Testing软件测试网"^,b5o;^%a"y+T/t:\

4G$^ZP;y0’声明一个长度为11的全局整型数组Class51Testing软件测试网yv(@z7z g(ar+@l

51Testing软件测试网,n0P*Y L"A-Vs

Public Class(10) As Integer

j'f)?"Q{0

P,Z.e4a0R&`&}0一维数组中的元素个数为(上界-下界+1)。

:g@#BQg0 51Testing软件测试网/Y#Lv/W:q6v VqW

为数组赋初值可以采用循环语句,如:

r@C1wH7}S/p.g0

:F\A)`9C-a ]I0        Dim I As Integer51Testing软件测试网uYWCvP^8S'LJ'OM

3g:b m{7l6o0        For I = 0 To 11             ’循环语句的使用程序流程的控制

n/h/Vqq"lN Mi;f0

$_x3A!W#S_G.{3n]0             C(I) = I51Testing软件测试网&CO+DrJZ,|fd

Xc4tAk@Qo0        Next I51Testing软件测试网6_3| OD@.X

I^ c iA+K#S0  如果不显式指定下标下界,则数组的下标下界由 Option Base 语句控制。如果没有 Option Base 语句则下界为默认为 0。

4}7yr0NXW#o&i)y:aY0 51Testing软件测试网7w%]g#F{Z

数组的维数并不限于2,在VB中,可以扩大至于60,在实际应用上对三维以上的数组的应用是不多的。定义一个多维数组时只需一条Dim语句指定数组的所有下标边界即可,使用多维数组的可以很方便的表示一些有意义的统计数据。例如:51Testing软件测试网@m}o^

H0I4h ]lj-n0Dim  Profit(16,10,12)  As Currency51Testing软件测试网moev{(d

51Testing软件测试网 N6c"q%v![h

这个Profit数组可用来表示以店名、部门及月份为参数的某百货公司的利润。如:Profit(2,8,11)代表了第二分店的第八部门在11月份的利润。51Testing软件测试网,O w6nU[ HG

51Testing软件测试网5^lX3G s8nu

4.动态数组
3?7V hW P6QN8a4D4x0有时在数组开始使用前,不能知道需要多大的数组才能满足实际需要。当然可以把数组的大小定义到足够大来满足任意的实际应用需要,这种方法效率很低(大量浪费内存空间)。如果使用动态数组,就可以在程序运行时根据实际需要,精确定义数组的大小。

(D3]6N Sp HN.\|k0 51Testing软件测试网9b/q {k;w1Yu`w%S

在声明数组时,不给出维数列表就是将数组声明为动态数组。例如:51Testing软件测试网 `EM*O}p)ZI;`

|re ny0              Dim  MyArry() As Integer

hy1d2S/J.|gw0

N&T9Ey,V @h1W q/s7G0在使用动态数组前,必须使用ReDim语句把它重新定义。如前面声明的数组MyArry,可以用以下语句将它定义为一个动态二维数组。

d J4Fz8n0[ A0

cG s:g EaNy0              ReDim  MyArry(10,10)51Testing软件测试网z"_1V2k6e*R

51Testing软件测试网0vH/Km%TT!X

还可以通过重复执行ReDim语句,多次定义动态数组。使用ReDim最多能定义数组的维数是60。ReDim语句可以改变数组每维的元素个数,但不能改变维数。下面是对ReDim语句的一个标准应用举例。51Testing软件测试网+k?;m:ddg!g.^8a

;m1O\m$cM0z}0              Dim  MyArry() As Single          ‘声明动态数组

1u1UW5axs S~3v;Z oA0 51Testing软件测试网kY7o5lFp

              ReDim  MyArry(30,20,10)          ‘重新定义数组51Testing软件测试网g7|uRC9T

~6E+C%P8HB5|1g0              ReDim  MyArry(50,23,21)          ‘再次重新定义数组

7Yq2PVBn0

i9c leD J"w3{t"V t0ReDim的语法与Dim的相同,此外,它还有选择项Preserve关键词:51Testing软件测试网2t0XZG,}+GG0P

51Testing软件测试网F}6L-\` `q'd7zv!@W

              ReDim  Preserve  数组名 ([ [下标下界 To]下标上界])  [As  数据类型]

S#X3_~C0 51Testing软件测试网7i/c1u uFxv1X

例如:51Testing软件测试网,_Z}5aD5b'E

"q,M\w ?0              ReDim  MyArry(50,23,21)51Testing软件测试网ljy!BRrA

51Testing软件测试网V`_R@`0x;QH-l

              ReDim  Preserve  MyArry(50,23,50)51Testing软件测试网*Bh\W7^t}&u*K

0QB$y^*z&W{}'n3r5w0注意:使用ReDim 时,重新定义数组会使所有数组元素的值消失,而使用Preserve可以保留数据。但是用Preserve只能在改变数组的最后一维的大小时,保留数组的数据。对于一维数组来说,所有数据都会保留,而对于多维数组:只能改变最后一维的大小,才能保留全部数组数据,否则出错。

)`En V,K$lm0 51Testing软件测试网[#iqA|b^.x

5.LBound 函数和UBound 函数
V|@ L1N7n0LBound 函数和Ubound函数都是返回一个 Long 型数据,前者得到的值为指定数组维可用的最小下标,而后者得到的是最大下标。它们的语法为:

%N:rt9eM5i0

gy]L9@0LBound(数组名[, 指定的维数])

9?-P"?@1T(x0 51Testing软件测试网:m!^T1vSL

UBound(数组名[, 指定的维数])

VN4Y1HDPnU"y0

3a&OWR'np0  其中数组名是必选的。指定的维数是可选的,表明指定返回哪一维的下界。1 表示第一维,2 表示第二维,如此类推。如果省略指定的维数,就默认为是 1。

:l%G&A6zL9})V0

8qf:K KZ(R?Z*y0]0  关于如何使用LBound 函数与 UBound 函数可参见下例:51Testing软件测试网NR"l$as%W

_ rD"U l$e:h0Dim A(1 to 100,3,-3 to 4) As Integer  ’定义一三维数组,假定没有使用Option Base 语

Bu3Gtc!Rs!n0

?1} _&a o,v0]a%L B3N0’句改变数组下界的默认值。

6NJ?@Y N8Bj0 51Testing软件测试网;rTI*Jn}9L

对数组A使用Lbound 和Ubound函数,其返回值列表如下 51Testing软件测试网&c\ B.xf

51Testing软件测试网|`.NBa;o

51Testing软件测试网:wp^2aA7P CO$@o|Y
所有维的缺省下界取决于 Option Base 语句的设置。可以看出对一数组使用LBound 函数与 UBound 函数,可用于确定一个数组中元素的个数。

+w#Ql#V gv6j0 51Testing软件测试网e%S}4|M3J0n

对于那些在声明中用 To 子句来设定维数的数组而言,它们可以用任何整数作为下界而不受Option Base 语句的限制。51Testing软件测试网#{nj3yRS

51Testing软件测试网%_9sc\~ D~9c

6.数组的高级功能
8E+D'wFf2L,|HY0尽管数组最通常被用来存储成组的变量,但是在别的一些方面数组也是很有用的。可以将一个数组的内容赋值给另一个数组、创建返回数组的函数,还可以创建返回数组的属性。在许多情况下,这些技术能改进应用程序的性能。

6IR?+C;Y0B'LN0 51Testing软件测试网AgW5PB{&P

正如可以将一个变量的值赋给另一个变量,例如 StrA = StrB ,也可以将一个数组的内容赋给另一个数组。例如,要将一字节型数组从一个位置复制到另一个位置。可以通过每次复制一个字节来实现,程序如下:

"TkwJ&B0 51Testing软件测试网 [3CTj-fdz?&F [

Sub ByteCopy(oldCopy() As Byte, newCopy() As Byte)51Testing软件测试网n6b"v y8{!AW

J'Pk1Sr"Q ln,J0‘参数oldCopy()是源数组,newCopy()是目标数组

8u ~ Qk9@)J @ka0 51Testing软件测试网$be%}'h.^

   Dim i As Integer51Testing软件测试网%?tTi9R2gJ:\&tM'q

0fF+Y9h,Ld0   ReDim newCopy (Lbound(oldCopy) To UBound(oldCopy)) ’重新定义动态数组51Testing软件测试网Qv'AH:P}.g

51Testing软件测试网(I'yE1[-}LH

   For i = Lbound(oldCopy) To Ubound(oldCopy)        ’循环赋值

5DxF] v4v~1a\0

}"v6qp6v!p J:B$~7X0      newCopy(i) = oldCopy(i)

F/_2t&u,gL0 51Testing软件测试网2HoQ(pJ'ro

   Next51Testing软件测试网+_tof)|%K"a

51Testing软件测试网MZ2ZWGO ^

End Sub

!\5xFw:Cy0 51Testing软件测试网+yE#^(l+o)B1o

一个更有效的简单的方法就是直接将一个数组赋给另外一个数组:51Testing软件测试网 [2h$v${ ?~

L"` k!h9w,P0Sub ByteCopy(oldCopy() As Byte, newCopy() As Byte)51Testing软件测试网3R0z7C0_'P&z

"^%_0p]e.`B$W0‘参数oldCopy()是源数组,newCopy()是目标数组51Testing软件测试网I b6\B6EE0Q

51Testing软件测试网2g3{#?a!X)r

   newCopy = oldCopy        ’利用数组直接进行赋值51Testing软件测试网"a4k;` x;^

0Z.R%y kq/C ~)r*gQa4p0End Sub51Testing软件测试网"[9U8? @cr+m

}j k'\%Pf2zd0关于变量赋值有一些规则需要铭记。例如,虽然可以将一个声明为整型的变量赋给一个声明为长整型的变量而不会产生任何问题,但是将一个长整型变量赋给一个整型变量就很容易导致溢出错误。除了遵守有关数据类型变量之间赋值时的规则外,数组赋值还要遵从另外一些规则,包括数组维数,每一维的大小,以及数组是固定的还是动态的。51Testing软件测试网I J4U7a,xYR h e

51Testing软件测试网^7ptv*]#pE ?,\}FY Z

①维数、数据类型不同的数组赋值考虑的几个因素

hlXkn5Z1f0 51Testing软件测试网&x K0I.R@(kyjs

l         赋值符左边的数组类型:固定数组 (Dim x(1 to 10) As Integer) 或者动态数组 (Dim x() As Integer)。51Testing软件测试网2k"Xvhje a

H5PX3GpR0l         赋值符左边数组的维数是否和赋值符右边数组的维数匹配。51Testing软件测试网,i$q(O4O7uY

51Testing软件测试网iG {%y^?a%?/sX

l         赋值符两边数组的每一维的数组元素个数是否匹配。即使数组的声明不同,维数也可能匹配。比如一个数组的每一维元素从 0 开始编号而另一个则从 1 开始,维数也可能匹配。

;J${{j.U)}0

,Z G!c R6]C6t%L9a7w0l         赋值符两边所有元素的数据类型必须是相容的。这些规则和变量赋值的规则是一致的。

#WTL*xb(rJ0

.L'cpT rO8A1_+Qjy0表3-6显示了这些因素的影响:

4l{D4BAI ae0

bf3Z)N*u9X$z,q0
/k5R[-~+f,S,M*i0数组赋值时的错误可能发生在编译时,也可能发生在运行时(例如,如果数据类型不能强制转换或赋值试图重新声明 (ReDim) 一个静态数组)。设计程序时要添加错误处理以确保数组在赋值之前是匹配的。51Testing软件测试网g w;` \?y6n M

4CA\+M!B4p @0②编写返回数组的函数51Testing软件测试网*I;q*?+zX"Y3?.^

|%r@%gPAoIl5D/v0从一个函数返回一组值是可能实现的。例如,从一个函数返回一组字节而不必将其先转换为一个字符串然后再转换回来。51Testing软件测试网v\nE U5a

51Testing软件测试网#No2W5uv+J)y9q

下面是一个使用返回字节数组的函数的简单示例:

"k(\ N"E,QTS0 51Testing软件测试网_ VE \l7o

Private Sub Form_Load()51Testing软件测试网C$N REW@8oX h

51Testing软件测试网 vu9vz eK gIQ

   Dim b As Byte51Testing软件测试网H1v(r(h*}

51Testing软件测试网1CAO&I?

   Dim i As Integer

:Rcf'M,A+]v"sY0 51Testing软件测试网!J5cWd:NI P

   Dim ReturnArray() As Byte51Testing软件测试网 n4sC S#@,d_&L3lS

51Testing软件测试网T&axa3P9NT5I

   b  = Cbyte(54)51Testing软件测试网,jR4XsG0F(f$K!|

w B{iC0A0   ReturnArray() = ArrayFunction(b)  ’调用函数51Testing软件测试网0y*?!fQ:F

^^+]x[0   For i = Lbound(ReturnArray) To Ubound(ReturnArray)51Testing软件测试网-|"d'g ic3rP

51Testing软件测试网8oEEz/{hO;R

      Msgbox ReturnArray(i)  ’通过弹出消息框循环显示数组值 51Testing软件测试网S F5c:p9x;Y

51Testing软件测试网y:h(N&Ye/\ Ss

   Next

b0K3_ t~+T9u^0

1s?6l!JT6AL]0End Sub51Testing软件测试网UTzyA b%U#Y#b9t

0?.f3Ho d z0  51Testing软件测试网4O)zm7z-rP5\ ~

\9W5NG6AH0Public Function ArrayFunction(b As Byte) As Byte()

yf(F5o\vjU2U0

zIaZ4Jre0   Dim x(2) As Byte

?dM6z q.{{gV b0 51Testing软件测试网/m/fv9V"H6k6mC;[ B

   x(0) = b51Testing软件测试网Iy(?;]:x%P5h

51Testing软件测试网b&uwLLo,Gu+C}

   x(1) = b + CByte(200)

vmGK,y)h0 51Testing软件测试网eb d*Z V'NBl

   x(2) = b + b

q,C,zII\.AS9F0 51Testing软件测试网Vn:tO3`0Pg

   ArrayFunction = x   ’返回结果为数组x51Testing软件测试网&J_-p(nB}$~@Ti?

?6c] ST }A q0End Function51Testing软件测试网H#`:RMKT

r#z][i8F0  

$U Bc4Vk'FPa0

4D AE,p#cGw+igg2}0在运行以上示例后, ReturnArray() 是一个三元素数组,其中包含了分配给 ArrayFunction 中数组的值。ArrayFunction 语句将一个数组作为参数传递;且数组的数据类型必须和函数的数据类型相同(在本例中是字节)。因为这是一个函数调用,传递数组时不必带括号。

Zf)VZ`Ky K\p+m0

*e b&yIEa_0注意:

;f"O$N&{{zL?0

7l^8bTBs.@Y01.尽管可以通过赋值给另一个数组(ArrayFunction = x())来返回一个数组,但出于性能方面的考虑,并不推荐使用这种方法。

O7c#\'HOz? J0

&@hB p/TK5r*|3pm02.必须为返回数组的函数指定一个类型,这个类型可以是 Variant。这样一来,Function X() As Variant() 是有效的而 Function X() As () 将失败。 51Testing软件测试网5F$u0e-QSt3x%d?.`

51Testing软件测试网~)H d*x F

3.当调用一个返回数组的函数时,用来保存返回值的变量也必须是一个数组,而且其数据类型必须和函数返回类型相同,否则将显示一个“类型不匹配”的错误。51Testing软件测试网.~:IWBIRC\.]#{x


TAG: ASP

 

评分:0

我来说两句

Open Toolbar