LBound, UBound

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LBound, UBound相关的知识,希望对你有一定的参考价值。

LBound, UBound数组上(下)标是什么意思,请举几个实例解释下- -
For index = 0 To UBound(arrAllLine)-1
后面的-1是什么意思?

比如
dim a(10) as integer
ubound(a)=10
就是返回数组的上界
上面的-1就是从0到数组的上界减去1
比如上面的数组a的上界为10 那就是index从0到9执行9次循环
lbound是返回数组下界的意思
不知道你明白没
参考技术A 我直接复制了
Sub 示例_1_023()
Dim Arr(1 To 10, 5 To 15, 10 To 20)
Dim Arr1(10)
[a1] = "数组变量:Arr(1 To 10, 5 To 15, 10 To 20) "
[a2] = "数组变量:Arr1(10) "
[a3] = "LBound(Arr, 1) 返回 ": [b3] = LBound(Arr, 1)
[c3] = "UBound(Arr, 1) 返回 ": [d3] = UBound(Arr, 1)
[a4] = "LBound(Arr, 3) 返回 ": [b4] = LBound(Arr, 3)
[c4] = "UBound(Arr, 3) 返回 ": [d4] = UBound(Arr, 3)
[a5] = "LBound(Arr1) 返回 ": [b5] = LBound(Arr1)
[c5] = "UBound(Arr1) 返回 ": [d5] = UBound(Arr1)
End Sub
代码详解
1、Sub 示例_1_023():宏程序的开始语句。宏名为示例_1_023。
2、Dim Arr(1 To 10, 5 To 15, 10 To 20) :声明Arr为3维数组变量。
3、Dim Arr1(10) :声明Arr1为1维数组变量。
4、[a1] = "数组变量:Arr(1 To 10, 5 To 15, 10 To 20) " :把字符串赋给单元格A1。
5、[a2] = "数组变量:Arr1(10) " :把字符串赋给单元格A2。
6、[b3] = LBound(Arr,1) :运用LBound函数,返回数组Arr的第1维的最小可用下
界,返回1,赋给单元格B3。
7、[d3] = UBound(Arr,1) :运用UBound函数,返回数组Arr的第1维的最大可用上
界,返回10,赋给单元格D3。
8、[b4] = LBound(Arr,3) :运用LBound函数,返回数组Arr的第3维的最小可用下
界,返回10,赋给单元格B4。
9、[d4] = UBound(Arr,3) :运用UBound函数,返回数组Arr的第3维的最大可用上
界,返回20,赋给单元格D4。
10、[b5] = LBound(Arr1) :运用LBound函数,返回数组Arr1的最小可用下界,返回0或者1,要取决于Option Base的设置,默认为0。
11、[d5] = UBound(Arr1) :运用UBound函数,返回数组Ar1r的最大可用上界,返回10,赋给单元格D5。

LBound 函数
返回一个 Long 型数据,其值为数组指定维可用的最小下界。
LBound(arrayname[, dimension])
LBound 函数的参数:
arrayname 必需的。数组变量的名称,遵循标准的变量命名约定。
dimension 可选的;Variant (Long)。指定返回哪一维的下界。1 表示第一维,2 表示第二维,如此类推。如果省略 dimension,就认为是 1。

UBound 函数
返回一个 Long 型数据,其值为指定的数组维可用的最大上界。

UBound(arrayname[, dimension])
UBound 函数的语法包含下面部分:

arrayname 必需的。数组变量的名称,遵循标准变量命名约定。
dimension 可选的;Variant (Long)。指定返回哪一维的上界。1 表示第一维,2 表示第二维,如此等等。如果省略 dimension,就认为是 1。
说明
UBound 函数与 LBound 函数一起使用,用来确定一个数组的大小。LBound 用来确定数组某一维的上界。
参考技术B 下标:数组元素最小的序号
上标:
数组元素最大的序号
dim
a(2)
'数组序号从
0

2,即:
a(0)
a(1)
a(2)
s1
=
lbound(a)
'返回
0
s2
=
ubound(a)
'返回
2
dim
b(2
to
5)
'数组序号从
2

5,即:
a(2)
a(3)
a(4)
a(5)
b1
=
lbound(b)
'返回
2
b2
=
ubound(b)
'返回
5
end
sub
参考技术C LBound 函数:
返回一个 Long 型数据,其值为指定数组维可用的最小下标。

示例:使用 LBound 函数来返回数组的指定维数的最小可用下标。可以使用 Option Base 语句取代数组缺省下标值 0。

Dim Lower
Dim MyArray(1 To 10, 5 To 15, 10 To 20) '声明数组变量。
Dim AnyArray(10)
Lower = Lbound(MyArray, 1) '返回 1。
Lower = Lbound(MyArray, 3) '返回 10。
Lower = Lbound(AnyArray) '返回 0 或 1,取决于 Option Base 的设置。

----------------------------------------------------------------

UBound 函数:
返回一个 Long 型数据,其值为指定的数组维可用的最大下标。

示例:使用 UBound 函数,确定数组的指定维的最大可用下标。

Dim Upper
Dim MyArray(1 To 10, 5 To 15, 10 To 20) '声明数组变量。
Dim AnyArray(10)
Upper = UBound(MyArray, 1) '返回 10。
Upper = UBound(MyArray, 3) '返回 20。
Upper = UBound(AnyArray) '返回 10。

-----------------------------------------------------------------
说明:
LBound 函数与 UBound 函数一起使用,用来确定一个数组的大小。UBound 用来确定数组某一维的上界。

For index = 0 To UBound(arrAllLine)-1

如果 arrAllLine 数组是从0-9,共10条记录,UBound(arrAllLine)是返回 arrAllLine 数组的最大下标9,UBound(arrAllLine)-1 就是只循环读取0-8的元素数据。

在 Classic Asp VBScript 中遍历数组的最佳方法是啥?

【中文标题】在 Classic Asp VBScript 中遍历数组的最佳方法是啥?【英文标题】:What is the best way to iterate through an array in Classic Asp VBScript?在 Classic Asp VBScript 中遍历数组的最佳方法是什么? 【发布时间】:2010-09-05 08:46:23 【问题描述】:

在下面的代码中

For i = LBound(arr) To UBound(arr)

使用LBound 提问有什么意义?当然,它总是 0。

【问题讨论】:

【参考方案1】:

为什么不使用For Each?这样您就无需关心LBoundUBound 是什么。

Dim x, y, z
x = Array(1, 2, 3)

For Each y In x
    z = DoSomethingWith(y)
Next

【讨论】:

您不能使用For Each 直接编辑数组单元格,因为您的示例中的y 是数组单元格的副本,而不是引用。对于数组编辑,For i = LBound(arr) To UBound(arr) 将允许使用arr(i) 直接引用单元格并编辑单元格内容(如arr(i) = Trim(arr(i)))。【参考方案2】:

有充分的理由不使用For i = LBound(arr) To UBound(arr)

dim arr(10) 分配数组的 11 个成员,从 0 到 10(假设 VB6 默认选项基)。

许多 VB6 程序员假定数组是从 1 开始的,并且从不使用分配的 arr(0)。我们可以通过使用For i = 1 To UBound(arr)For i = 0 To UBound(arr) 来消除潜在的错误来源,因为这样就可以清楚地知道是否使用了arr(0)

For each 复制每个数组元素,而不是指针。

这有两个问题。

    当我们尝试为数组元素赋值时,它不会反映在原始元素上。此代码将值 47 分配给变量 i,但不影响 arr 的元素。

    arr = 数组(3,4,8)
    对于 arr 中的每个 i
         我 = 47
    接下来我
    Response.Write arr(0) '- 返回 3,而不是 47

    我们不知道for each 中数组元素的索引,也无法保证元素的顺序(虽然看起来是有序的)。

【讨论】:

为什么 VB6 程序员会假设数组是从一开始的?从零开始是 VB6 中数组的默认设置,除非在 Option Base 语句中另行指定或在声明数组时显式定义下边界。我更喜欢使用LBound,因为它可能并不总是 0(尽管正如 AnthonyWJones 所指出的,在 VBS 中它几乎总是如此)。但我认为拥有一个从零开始的数组而不使用分配的arr(0) 是不好的做法(因此我们不应该假设有人这样做)。不过,我确实同意反对使用 For Each 的论点。【参考方案3】:

LBound 可能并不总是 0。

虽然在 VBScript 中无法创建除 0 下限以外的任何值的数组,但仍然可以从可能指定了不同 LBound 的 COM 组件中检索变体数组。

也就是说我从来没有遇到过这样的人。

【讨论】:

【参考方案4】:

可能来自VB6。因为在 VB6 中使用Option Base 语句,您可以像这样更改数组的下限:

Option Base 1

同样在 VB6 中,您可以像这样更改特定数组的下限:

Dim myArray(4 To 42) As String

【讨论】:

【参考方案5】:

我一直使用 For Each 循环。

【讨论】:

【参考方案6】:

这是我的方法:

dim arrFormaA(15)
arrFormaA( 0 ) = "formaA_01.txt"
arrFormaA( 1 ) = "formaA_02.txt"
arrFormaA( 2 ) = "formaA_03.txt"
arrFormaA( 3 ) = "formaA_04.txt"
arrFormaA( 4 ) = "formaA_05.txt"
arrFormaA( 5 ) = "formaA_06.txt"
arrFormaA( 6 ) = "formaA_07.txt"
arrFormaA( 7 ) = "formaA_08.txt"
arrFormaA( 8 ) = "formaA_09.txt"
arrFormaA( 9 ) = "formaA_10.txt"
arrFormaA( 10 ) = "formaA_11.txt"
arrFormaA( 11 ) = "formaA_12.txt"
arrFormaA( 12 ) = "formaA_13.txt"
arrFormaA( 13 ) = "formaA_14.txt"
arrFormaA( 14 ) = "formaA_15.txt"

Wscript.echo(UBound(arrFormaA))
''displays "15"

For i = 0 To UBound(arrFormaA)-1
    Wscript.echo(arrFormaA(i))
Next

希望对你有帮助。

【讨论】:

以上是关于LBound, UBound的主要内容,如果未能解决你的问题,请参考以下文章

使用 mpi_f08 模块时调用 mpi_gatherv 后数组的 Lbound 发生变化

随机数的生成

在 Classic Asp VBScript 中遍历数组的最佳方法是啥?

VB识别分隔符

如何正确结束基本功能

对象不接受方法