如何修复“索引超出数组范围”并将值写入数组

时间:2012-08-11 08:30:51

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

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

当您点击骰子#文本框的值为“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

2 个答案:

答案 0 :(得分:3)

您在这里宣布您的数组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

答案 1 :(得分:1)

我建议你更改数组并使用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