Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IndexOutOfRangeException?_C# - Fatal编程技术网

C# IndexOutOfRangeException?

C# IndexOutOfRangeException?,c#,C#,在下面的代码中,我接收到一个超出范围的异常 private void btnRoll_Click(object sender, EventArgs e) { int success4 = 0; int success6 = 0; int success8 = 0; int success10 = 0; int success20 = 0; int botch4 = 0; int

在下面的代码中,我接收到一个超出范围的异常

private void btnRoll_Click(object sender, EventArgs e)
    {
        int success4 = 0;
        int success6 = 0;
        int success8 = 0;
        int success10 = 0;
        int success20 = 0;
        int botch4 = 0;
        int botch6 = 0;
        int botch8 = 0;
        int botch10 = 0;
        int botch20 = 0;

        if (cbnd4.SelectedIndex != 0)
        {

            int value = 4;
            int arraySize = (int)cbnd4.SelectedIndex;
            int[] refArray = randomNumber(value, arraySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 2)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch4++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if(refArray[i] >= 2)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch4++;
                    }
                }


            }
        }
           /* if (cbmd4.SelectedIndex != 0)
            {
            }
            */
         if (cbnd6.SelectedIndex != 0)
        {
            int value = 6;
            int arrySize = (int)cbnd6.SelectedIndex;
            int[] refArray = randomNumber(value, arrySize);
            foreach (int i in refArray)
            {


                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 4)
                    {
                        success6++;
                    } if (refArray[i] == 1)
                    {
                        botch6++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if (refArray[i] >= 4)
                    {
                        success6++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch6++;
                    }
                }


            }
        }
        if (cbnd8.SelectedIndex != 0)
        {
            int value = 8;
            int arrySize = (int)cbnd8.SelectedIndex;
            int[] refArray = randomNumber(value, arrySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 5)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch8++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if (refArray[i] >= 5)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch8++;
                    }
                }


            }
        }
        if (cbnd10.SelectedIndex != 0)
        {
            int value = 10;
            int arrySize = (int)cbnd10.SelectedIndex;
            int[] refArray = randomNumber(value, arrySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 7)
                    {
                        success10++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch10++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if (refArray[i] >= 7)
                    {
                        success10++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch10++;
                    }
                }


            }
        }
        if (cbnd20.SelectedIndex != 0)
        {
            int value = 20;
            int arrySize = (int)cbnd20.SelectedIndex;
            int[] refArray = randomNumber(value, arrySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 16)
                    {
                        success20++;
                    }
                    if (refArray[i] == 1)
                    {
                    botch20++;
                    }
                }
                if (cbGame.SelectedIndex == 2)
                {
                    if (refArray[i] >= 7)
                    {
                        success20++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch20++;
                    }
                }


            }
        }
        lBotch_Result.Text = Convert.ToString(botch4 + botch6 + botch8 + botch10 + botch20);
        lSuccess_Result.Text = Convert.ToString(success4 + success6 + success8 + success10 + success20);
        MessageBox.Show("d4 successes: " +
            success4.ToString() +
            "\r\nd6 Successes: " +
            success6.ToString() +
            "\r\nd8 Successes: " +
            success8.ToString() +
            "\r\nd10 Successes: " +
            success10.ToString() +
            "\r\nd20 Successes: " +
            success20.ToString() +
            "\r\nd4 Botches: " +
            botch4.ToString() +
            "\r\nd6 Botches: " +
            botch6.ToString() +
            "\r\nd8 Botches: " +
            botch8.ToString() +
            "\r\nd10 Botches: " +
            botch10.ToString() +
            "\r\nd20 Botches: " +
            botch20.ToString());

}
当if(refArray[i]>=7)和refArray.Length包含奇数int值时,会发生超出范围的异常

以下是异常输出:

System.IndexOutOfRangeException为 未处理的
Message=“IndexOutOfRangeException”
堆栈跟踪: 在桌面上,游戏骰子,表格1,点击(对象) 发送方,事件参数(e) 在System.Windows.Forms.Control.OnClick(EventArgs)中 (e) 在System.Windows.Forms.Button.OnClick(EventArgs)中 (e) 在System.Windows.Forms.ButtonBase.WnProc(WM wm、Int32 wParam、Int32 lParam) 在System.Windows.Forms.Control.\u InternalWnProc(WM wm、Int32 wParam、Int32 lParam) 在Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain) 在System.Windows.Forms.Application.Run(窗体 (调频) 桌上游戏骰子程序Main()

如果您有任何建议,我们将不胜感激。为了解决这个问题,我已经用头撞墙5个小时了

哦,refArray从以下函数获取它的值:(如果有帮助的话)

private int[]随机数(int-value,int-arraySize)
{
int[]随机数组=新int[arraySize];
最大值=最大值;
Random rand=新的Random();
for(int i=0;i
显然,您正在试图访问数组末尾以外的数组元素

randomNumber()
方法生成一个随机数数组,其中数组的大小和最大值是独立的。因此,如果使用
arraySize
3和
value
20调用,它可能返回
{1,7,13}

然后使用
foreach(refArray中的inti)
对数组进行迭代。因此,将有三次迭代,
i
设置为1,然后是7,最后是13

因此,如果您使用
refArray[i]
访问数组,您将尝试访问数组元素和索引1、7和13,因此在第二次迭代中获得
IndexOutOfRangeException
,因为您尝试访问索引7处的元素,而数组仅包含3个元素


您是否打算使用
for(int i=0;iforeach
循环?

您显然在试图访问数组末尾以外的数组元素

randomNumber()
方法生成一个随机数数组,其中数组的大小和最大值是独立的。因此,如果使用
arraySize
3和
value
20调用,它可能返回
{1,7,13}

然后使用
foreach(refArray中的inti)
对数组进行迭代。因此,将有三次迭代,
i
设置为1,然后是7,最后是13

因此,如果您使用
refArray[i]
访问数组,您将尝试访问数组元素和索引1、7和13,因此在第二次迭代中获得
IndexOutOfRangeException
,因为您尝试访问索引7处的元素,而数组仅包含3个元素


您是否打算用
来代替
foreach
循环(inti=0;i
。尝试将所有这些代码封装在函数中每个“if”(cbndXX.SelectedIndex!=YY)的内部

大概是这样的:

private void RefactorizedFunction(ComboBox cmb, ComboBox cbGame, ref int success, ref int botch, int value, int maxsuxcess)
{
    var arraySize = (int)cmb.SelectedIndex;
    int[] refArray = randomNumber(value, arraySize);

    foreach (int i in refArray)    //WARNING HERE...
    {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= maxsuxcess)
                    {
                        success++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch++;
                    }
                }
                if (cbGame.SelectedIndex != 2) continue;
                if (refArray[i] >= maxsuxcess)
                {
                    success++;
                }
                if (refArray[i] == 1)
                {
                    botch++;
                }
            }
    }

它没有经过测试,也不会解决您的问题,但我相信您的代码会更容易调试。还有其他方法可以改进您的代码,比如使用字典或数组来代替所有这些successXX和botchXX变量,但是…一步一步。

我没有发现错误,但您正在重复大量代码。请尝试封装所有这些c函数中每个“if”(cbndXX.SelectedIndex!=YY)的内部ode

大概是这样的:

private void RefactorizedFunction(ComboBox cmb, ComboBox cbGame, ref int success, ref int botch, int value, int maxsuxcess)
{
    var arraySize = (int)cmb.SelectedIndex;
    int[] refArray = randomNumber(value, arraySize);

    foreach (int i in refArray)    //WARNING HERE...
    {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= maxsuxcess)
                    {
                        success++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch++;
                    }
                }
                if (cbGame.SelectedIndex != 2) continue;
                if (refArray[i] >= maxsuxcess)
                {
                    success++;
                }
                if (refArray[i] == 1)
                {
                    botch++;
                }
            }
    }

它没有经过测试,也不会解决您的问题,但我相信您的代码将更易于调试。还有其他改进代码的方法,比如使用字典或数组代替所有这些successXX和botchXX变量,但是。。。一步一步。

这段代码是否能够生成一个等于数组大小的int,并在i从数组中读取该项时导致outofrange异常

int[] refArray = randomNumber(value, arraySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 2)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch4++;
                    }
                }

这段代码是否能够生成一个等于数组大小的int,并在i从数组中读取该项时导致outofrange异常

int[] refArray = randomNumber(value, arraySize);
            foreach (int i in refArray)
            {

                if (cbGame.SelectedIndex == 1)
                {
                    if (refArray[i] >= 2)
                    {
                        success4++;
                    }
                    if (refArray[i] == 1)
                    {
                        botch4++;
                    }
                }

这是你能提供的产生错误的最小代码块吗?这是一些丑陋的代码…一定有更好的方法来做你正在做的事情。minValue在哪里定义?最小的代码块?是的,因为它是产生错误的唯一代码块,很抱歉。:-)丑陋的代码,绝对的真理!由于这个应用程序还处于开发的早期阶段,我认为代码会很难看。但是由于这个应用程序只是在今天早些时候启动的,清理代码仍然是次要的…这是你能提供的产生错误的最小代码块吗?这是一些丑陋的代码…必须有更好的方法来做你正在做的事情。minValue在哪里定义?最小的代码块?是的,因为它是产生错误的唯一代码块,很抱歉。:-)丑陋的代码,绝对的真理!由于这个应用程序还处于开发的早期阶段,我认为代码会很难看。但是,由于这个应用程序今天才刚刚启动,清理代码仍然是次要的…非常感谢您的输入,因为这给了我一个新的方向来进行数组迭代。对于如何遍历数组值,您有什么建议的替代方法吗?我无法从代码中看出您实际上在尝试什么