关于VB数组的一个简单问题

Posted

tags:

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

一开始输入了一个a = Array(2, 8, 7, 6, 4, 28, 70, 25),后面又在一个for...next(For i = LBound(c) To UBound(c))里输入了一个c(i) = a(i) + b(i),最后运行时系统提醒我下标越界,之后我在通用上加了一行option base 1,又能正常运行了,但我想不通为什么.
Option Explicit
Private Sub Form_Click()
Dim i, n, a, b, c, temp As Single
ReDim c(1 To 8)
a = Array(2, 8, 7, 6, 4, 28, 70, 25)
.................................
Print "两个数组相对元素相加的结果为:"
For i = LBound(c) To UBound(c)
c(i) = a(i) + b(i)
Print c(i);
Next i
Print
Print "相加的结果降序为:"
For i = 1 To 7
For n = 1 To 8 - i
If c(n) < c(n + 1) Then
temp = c(n): c(n) = c(n + 1): c(n + 1) = temp
Print c(n);
End If
Next n
Next i
End Sub
前面有些省掉了,字数限制,我的b数组也弄好了,输出来没有错误,系统提示在c(i) = a(i) + b(i)下标越界

这里用了多个数组a、b、c,如果未指定Option Base 1,那么a的LBound就肯定是0(Array函数返回的数组下标默认是从0起算的),Ubound则是7,而b和c则不一定是0和7,有可能是1和8,那么For i = LBound(c) To UBound(c)就相当于For i = 1 To 8,当i=8时,a(i)=a(8)就超出a的下标范围了,所以提示下标越界。
如果指定了Option Base 1,那么a的LBound就是1,UBound是8,这样就跟b和c的下标范围一致了,就不会再出现“下标越界”的错误了。

补充:从你后面补充的代码来看,证明我说的是对的,a是0 to 7,而c是1 to 8,两者不一致,肯定不行啦!追问

追答

你要在排序过程全部完毕后再用循环把数组Print出来才行,不能够边排序边Print,这样输出的结果肯定是不准确的。打个比方,要在10个人中找出最高的人,那么第二个人比第一个人高,这时候你不可能认为第二个人就是最高的人吧?必须等10个人两两对比后才能得出最终的结果!

参考技术A option base是用于声明数组下标的缺省下界,VB默认为0追问

但是系统提示错误在c(i) = a(i) + b(i)上了,但是我的下标在for next里就是用lbound 和 ubound控制的啊,就是由array给的,怎么会越界

追答

array默认是从0开始,而i最大值是8,a最大只有7

BC30452:使用整数变量和整数数组的'='运算符问题 - VB Visual Basic

我是Visual Basic的新手,没有任何经验,除了使用办公室宏(由他人而不是我自己制作)并且在过去1-2天内自己崩溃,所以请原谅我的问题的基本性质。

我遇到了一个任务,我需要在CrystalReports中使用VB来制作简单的公式来决定填充公式包含字段的信息。我目前无法在我的系统上访问CrystalReports,所以我将循环/决策测试为VBScripts,看看它们是否有效。

到目前为止,我有2个工作循环,但希望第三个为用户提供他们想要使用的更多选项。

下面的循环是我遇到的问题:

    Dim userinput1 As Integer = Nothing
    Dim arrayset1 = New Integer() {1, 2, 3, 4}
    Dim arrayset2 = New Integer() {5, 6, 7, 8, 9}
    Dim arrayset3 = New Integer() {10, 11, 12, 13}
    Dim arrayother = New Integer() {14} 'this is just to keep with array formatting, no real reason for the 1 value array other than that

    Console.WriteLine("Enter Value:") 
    userinput1 = Console.ReadLine() 
    Console.WriteLine("Value Entered = " & userinput1) 
    Console.WriteLine()
    Console.ReadLine()

    If userinput1 = arrayset1 Then 
        Console.WriteLine(userinput1 & "_SUFFIX1")
    ElseIf userinput1 = arrayset2 Then
        Console.WriteLine(userinput1 & "_SUFFIX2")
    ElseIf userinput1 = arrayset3 Then
        Console.WriteLine(userinput1 & "_SUFFIX3")
    ElseIf userinput1 = arrayother Then
        Console.WriteLine(userinput1 & "_SUFFIX4")
    Else
        Console.WriteLine(userinput1)
    End If

我在Visual Studio 2017社区中编写和测试它,当我运行代码时,我收到错误“BC30452 Operator'='没有为类型'Integer'和'Integer()'定义。”

说实话,我不确定为什么我收到这个,“Integer”和“Integer()”之间的区别在于它们阻止它们与'='运算符一起使用。

我一直在尝试使它工作,但由于缺乏VB的知识(并且不知道我的问题的相关搜索术语),我的大部分尝试都缺乏有用的方向。

我有这个循环的另一个'版本',而不是使用数组我直接使用...将userinput1与其值进行比较...

if userinput1 = 1 Or userinput 1 =2 Or userinput1 = 3 Or userinput1 = 4 Then
    Console.WriteLine(userinput1 & "_SUFFIX1")
etc etc
.......

..我没有遇到问题。

在这个时间点只有14个变量值,使用“Or”并没有太多问题,但是变量的数量有可能增加,在这种情况下,我希望保持干净。我有另一个循环使用“SelectCase”,它也是干净的(呃),所以如果失败了,我仍然有那个循环。

我的问题基本上是,我以什么方式错误地使用导致我问题的数组?或者如果我的代码格式化有错误,它是什么?

除了我上面概述的以外,我还可以提出任何其他建议。

提前谢谢,LMacs。

P.S只是注意到没有“Console.WriteLine”等在输入到CrystalReports的代码中,也没有用户输入。写入函数和输入将由数据库引用填充。

答案

Integer()是一个整数数组,而Integer只是一个整数。错误消息是您不能使用=运算符来测试整数数组是否等于单个整数。该语言不知道如何做到这一点。语言怎么会知道你的意思?是否要查看数组是否只包含一个与另一个整数值相同的整数?或者您想检查数组是否在其整数列表中包含特定值?你需要更准确地了解你的意图。

根据您的示例,我假设您要查看数组是否包含输入的整数。为此,您可以使用数组的Contains方法:

If arrayset1.Contains(userinput1) Then 
    ' ...

但是,Contains实际上是LINQ提供的扩展方法,因此为了使用它,您需要导入System.Linq命名空间。如果您不想(或不能)使用LINQ,那么您可以使用Array.IndexOf方法:

If Array.IndexOf(arrayset1, userinput1) >= 0 Then
    ' ...

以上是关于关于VB数组的一个简单问题的主要内容,如果未能解决你的问题,请参考以下文章

关于如何去除数组中重复项

使 VB.NET 程序崩溃的简单方法

关于vb退出程序的问题

急!!vb怎么创建数组?

一个关于在VB中将Recordset 读出的内容放到一个数组变量中的问题!!

在 VB.NET 中比较数组