Как исправить индекс за пределами массива и записать значения в массив

Я пытаюсь написать подпрограмму Role-Playing Dice. Я использую Visual Studio 2010, пишу на Visual Basic. Весь синтаксис согласно Visual Studio правильный. Форма выглядит следующим образом:

Когда вы нажимаете числовые кнопки со значением «1» или «ноль» для текстовых полей «Количество кубиков», он бросает один кубик и дает вам одно случайное значение в зависимости от того, какую числовую кнопку вы нажимаете. Если вы поставите значение 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

person TroyPilewski    schedule 11.08.2012    source источник
comment
Хотя я не знаком с vb.net, я предполагаю, что вы не смогли правильно инициализировать iarray. Dim v, w, x, y, z, iarry(x) As Integer x может быть равно нулю, поэтому длина вашего массива также должна быть равна нулю. Поскольку единственная часть, к которой вы обращаетесь к этому массиву, - это когда x != 1 это должно быть.   -  person pdresselhaus    schedule 11.08.2012


Ответы (2)


Вы объявляете свой массив 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.

person Brian Hooper    schedule 11.08.2012
comment
В VB x будет верхней границей массива, а не его длиной. Таким образом, если x равно 0, то массив будет состоять из одного элемента. Если вам нужен массив из 10 элементов, он будет объявлен как iarry(9). - person Chris Dunaway; 13.08.2012

Я рекомендую вам изменить массив и использовать список (целое число), с ним проще работать, и вам не нужно инициализировать количество элементов списка.

Изменить:

Вот версия вашего кода, я не знаю, хотите ли вы этого.

 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
person Henry Rodriguez    schedule 14.08.2012