vb编程设计例题100例 vb数组下标
vb数组下标
vb数组下标
窗体的通用声明处、Option Base 1

VB数组下标问题
vb数组的下标只能是整数,不管你写什么vb都会尝试把他自动转换为整数,原则是:四舍六入五取整。
所以第二个是a(2);所以a(1.6)=a(2),而a(2)在循环中多次被赋值,它保留了最后一次的值:a(2.5)=2.5^2=6.25
不管谁写的这段程序,我都必须承认他很有幽默感
vb 数组下标越界
咱分析分析这么几句话。
Do
ReDim Preserve A(S)
A(S) = InputBox("请输入字符串,输入空串时结束", "输入")
S = S + 1
Loop Until A(S - 1) = ""
运行到 ReDim Preserve A(S),数组最大下标是S,假设是5。
运行到A(S) = InputBox("请输入字符串,输入空串时结束", "输入"),这句无关大碍,略。
运行到S = S + 1,注意此S非彼S了,比刚才大了1,按刚才的假设,是6.
如果按你的修改,运行到Loop Until A(S) = "" ,你想想,S大了1是6,所以A(S) 根本没有数据和他对应,A(6)根本就是空的。当然下标越界啦。
使用redim关键字设置动态数组大小
加入
redim arr(1 to year + 1)
arr(1) = corpus / 12 + corpus * rate
动态数组的用法:
组到底应该有多大才合适,有时可能不得而知。所以希望能够在运行时具有改变数组大小的能力。
动态数组就可以在任何时候改变大小。在 Visual Basic 中,动态数组最灵活、最方便,有助于有效管理内存。例如,可短时间使用一个大数组,然后,在不使用这个数组时,将内存空间释放给系统。
如果不用动态数组,就要声明一个数组,它的大小尽可能达到最大,然后再抹去那些不必要的元素。但是,如果过度使用这种方法,会导致内存的操作环境变慢。
要创建动态数组,请按照以下步骤执行:
(如果希望数组为公用数组,则)用 Public 语句声明数组,或者,(如果希望数组为模块级,则)在模块级用 Dim 语句声明数组,或者(如果希望数组为局部数组,则)在过程中用 Static 或 Dim 语句声明数组。给数组附以一个空维数表,这样就将数组声明为动态数组。
Dim DynArray ()
用 ReDim 语句分配实际的元素个数。
ReDim DynArray (X + 1)
ReDim 语句只能出现在过程中。与 Dim 语句、Static 语句不同,ReDim 语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。
ReDim 语句支持这样的语法,它与固定数组中使用的语法相同。对于每一维数,每个 ReDim 语句都能改变元素数目以及上下界。但是,数组的维数不能改变。
ReDim DynArray (4 to 12)
例如,用第一次声明在模块级所建立的动态数组 Matrix1:
Dim Matrix1 () As Integer
然后,在过程中给数组分配空间:
Sub CalcValuesNow ()
.
.
.
ReDim Matrix1 (19, 29)
End Sub
这里的 ReDim 语句给 Matrix 分配一个 20 × 30 的整数矩阵(元素总大小为 600)。还有一个办法,用变量设置动态数组的边界:
ReDim Matrix1 (X, Y)
注意 您可以将字符串赋值给大小可变的字节数组。一个字节数组也可以被赋值给一个可变长的字符串。一定要注意字符串中的字节数会随平台而变化。同一个字符串在 Unicode 平台上的字节数是它在非 Unicode 平台上的两倍。
保留动态数组的内容
每次执行 ReDim 语句时,当前存储在数组中的值都会全部丢失。Visual Basi 重新将数组元素的值置为 Empty(对 Variant 数组)、置为 0(对 Numeric 数组)、置为 零长度字符串(对 String 数组)或者置为 Nothing(对于对象的数组)。
在为新数据准备数组,或者要缩减数组大小以节省内存时,这样做是非常有用的。有时希望改变数组大小又不丢失数组中的数据。使用具有 Preserve 关键字的 ReDim 语句就可做到这点。例如,使用 UBound 函数引用上界,使数组扩大、增加一个元素,而现有元素的值并未丢失:
ReDim Preserve DynArray (UBound (DynArray) + 1)
在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;如果改变了其它维或最后一维的下界,那么运行时就会出错。所以可这样编程:
ReDim Preserve Matrix (10, UBound (Matrix, 2) + 1)
而不可这样编程:
ReDim Preserve Matrix (UBound (Matrix, 1) + 1, 10)
最简单的方法:
Private Sub Form_Load()
Dim a() As String
Open "d:已存.txt" For Binary As #1
a = Split(Input(LOF(1), #1), vbCrlf)
Close #1
End Sub
你的问题的解决方法:
Private Sub Form_Load()
Dim a()
Dim n As Long
Open "d:已存.txt" For Input As #1
Do While (Not EOF(1)) '读取已存.txt里有几行文字
Line Input #1, st
n = n + 1
Loop
Close #1
ReDim a(n - 1) '插入这行!
Open "d:已存.txt" For Input As #1
For i = 0 To n - 1
Line Input #1, a(i)
Next i
Close #1
End Sub
或者:
Private Sub Form_Load()
Dim a() As String
Dim i As Integer
Open "d:已存.txt" For Input As #1
Do Until EOF(1)
ReDim Preserve a(i)
Line Input #1, a(i)
i = i + 1
Loop
Close #1
End Sub
VB数组下标越界
当然会下标越界啦,你的for循环里有一句写的是
If a(i) < a(i + 1) Then
那你试想,当i=5的时候,这句就成了
If a(5) < a(6) Then
开始时你没有给数组元素6赋值,只赋值从0到5号,vb就当成6号没有了,所以就下标越界了。。。
如果我没猜错,你这段程序,本意应该是将数组元素降序排列的吧?
vb 数组下标越界问题
For w= 1 To 12
StrRec = MSComm1.Input
ReceiveArr(w+1) = StrRec(0) '提示数组下标越界
Next
动态数组
在很多情况下,数组的长度事先是无法预测的,而且有时可能需要在程序中改变数组的长度以适应新的情况,因此出现了动态数组。动态数组是在定义数组只指定数组名及其类型,等以后知道数组的长度或需要改变数组长度时再用“ReDim”指定它的长度。
VB 没用数组,下标越界
List的Item(好象是listindex)属性就属于控件数组,他的范围是(0~32767)
求vb二维数组下标
是下界吧?
用LBound函数:LBound(array,dim)
其中array是数组名,dim是数组维数
例如:
Public Sub main()
Dim a(1 To 4,6 To 8) As Long
MsgBox LBound(a, 1) '显示1
MsgBox LBound(a, 2) '显示6
MsgBox UBound(a, 1) '显示4
MsgBox UBound(a, 2) '显示8
End Sub
爱学记

微信收款码
支付宝收款码