【问题标题】:How do I fix "index was outside the bounds of the array" and write values to the array如何修复“索引超出数组范围”并将值写入数组
【发布时间】:2012-08-11 08:30:50
【问题描述】:

我正在尝试编写角色扮演骰子子程序。我正在使用 Visual Studio 2010 编写 Visual Basic。根据 Visual Studio 的所有语法都是正确的。表格如下:

当您在# of Dice 文本框中单击值为“1”或“null”的数字按钮时,它将掷一个骰子并根据您单击的数字按钮为您提供一个随机值。如果您输入 2 或更大的值,则程序将停止并给我以下异常错误。

我已经完成了研究,认为代码编写正确,但由于某种原因,值没有进入数组。想知道如何使值进入数组并使程序识别出不止一个骰子正在滚动。下面是其中一个按钮的代码副本。

Private Sub btnD4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnD4.Click
    Dim v, w, x, y, z, iarry(x) As Integer
    lvRolls.Items.Clear()
    If txt4Qty.Text = vbNullString Then
        x = 1
    Else
        x = CInt(txt4Qty.Text)
    End If
    If x = 1 Then
        z = CInt(Int(Rnd() * 5))
        If z > 4 Then
            z = 4
        ElseIf z < 1 Then
            z = 1
        End If
        lvRolls.Items.Add("Roll 1")
        lvRolls.Items(0).SubItems.Add(CStr(z))
        If txt4Mod.Text = vbNullString Then
            lblTotal.Text = CStr(z)
        Else
            w = CInt(txt4Mod.Text)
            lblTotal.Text = CStr(z + w)
        End If
    Else
        For y = 0 To x Step 1
            z = CInt(Int(Rnd() * 5))
            If z > 4 Then
                z = 4
            ElseIf z < 1 Then
                z = 1
            End If
            iarry(y) = z
        Next
        For v = 0 To x
            lvRolls.Items.Add("Roll " & v + 1)
            lvRolls.Items(x).SubItems.Add(CStr(iarry(y)))
        Next
    End If
End Sub

【问题讨论】:

  • 虽然不熟悉 vb.net,但我的猜测是您未能以正确的方式初始化 iarrayDim v, w, x, y, z, iarry(x) As Integer x 可能为零,因此数组的长度也应该为零。因为您访问该数组的唯一部分是 x != 1 应该是它。

标签: vb.net visual-studio-2010 vb.net-2010


【解决方案1】:

你在这里声明你的数组iarry:-

Dim v, w, x, y, z, iarry(x) As Integer

这将具有声明数组没有元素的效果。一旦知道 x 的值,您就需要

ReDim iarry(x)

编辑仔细阅读您的代码,看来您可能需要

ReDim iarry(x + 1)

x 元素数组进行标注可以得到0, 1, 2, ..., x-1 元素。

【讨论】:

  • 在 VB 中,x 是数组的上限,而不是长度。因此,如果 x 为 0,则该数组将只有一个元素。如果你需要一个包含 10 项的数组,它会被声明为 iarry(9)。
【解决方案2】:

我建议你更改数组并使用 list(of integer),它更容易使用并且你不需要初始化 list 的项目数。

编辑:

这是你的代码的一个版本,我不知道这是不是你想要的。

 Private Sub btnD4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnD4.Click

    Dim x As Integer = CInt(If(txt4Qty.Text <> vbNullString, txt4Qty.Text, 1))
    Dim iarry As New List(Of Integer)

    lvRolls.Items.Clear()

    If x = 1 Then

        Dim z As Integer

        z = (New Random).Next(1, 4)

        lvRolls.Items.Add("Roll 1")
        lvRolls.Items(0).SubItems.Add(z.ToString)

        If txt4Mod.Text = vbNullString Then
            lblTotal.Text = z.ToString
        Else
            lblTotal.Text = (z + CInt(txt4Mod.Text)).ToString
        End If

    Else

        Dim i As Integer

        For i = 0 To x
            iarry.Add((New Random).Next(1, 4))
        Next

        For v = 0 To x

            Dim t_item As New ListViewItem("Roll " & v + 1)

            lvRolls.Items.Add(t_item)

            t_item.SubItems.Add(CStr(iarry(v)))

        Next

    End If
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2014-04-11
    相关资源
    最近更新 更多