指数数组的边界之外?我不确定。 C#

时间:2018-01-13 10:36:28

标签: c# arrays exception indexing

我想创建一个方法,搜索数组中的最高值并使用它们创建另一个数组。然后,所有这些值都应该打印在richTextBox中(因为之后我会用文本绑定它们,我想用每个文本打印它们。)

我方法的代码:

private void selectPattern() {
    int[] tab = new int[12];
    int max = 0;
    int k = 0;
    int[] j = new int[12];

    for (int l = 0; l < 12; l++) {
        j[l] = 0;
    }

    // Patterns

    tab[0] = 3;
    tab[1] = 2;
    tab[2] = 5;
    tab[3] = 7;
    tab[4] = 1;
    tab[5] = 4;
    tab[6] = 4;
    tab[7] = 11;
    tab[8] = 3;
    tab[9] = 11;
    tab[10] = 11;
    tab[11] = 3;

    // Counting
    for (int i = 0; i < 12; i++) {
        if (tab[i] >= max) {
            max = tab[i];
            j[k] = i;
            k++;
            for (k = 0; k < 12; k++) {
                if (j[k] != 0) {
                    richTextBox1.Text = j[k].ToString();
                    richTextBox1.Text = Environment.NewLine;
                }
            }
        }
    }
}

但它只是第一次有效,现在我得到了:

  

System.IndexOutOfRangeException:索引超出了数组的范围。      在Form1.cs中的WindowsFormsApp2.Form1.selectPattern():第59行

第59行是这样的:

j[k] = i;

我在方法的开头设置k的0值,所以我假设,每次调用此方法时都应该重写该索引。任何人都可以解释一下,为什么它不起作用?

感谢您的帮助

@EDIT 具有更多描述性变量名称的代码

private void selectPattern()
    {
        int[] valueTab = new int[12];
        int maxValue = 0;
        int indexIndex = 0;
        int[] indexTab = new int[12];

        //Filling indexTab with zeroes

        for (int zeroIndex = 0; zeroIndex < 12; zeroIndex++)
        {
            indexTab[zeroIndex] = 0;
        }

        //Patterns

        valueTab[0] = 3;
        valueTab[1] = 2;
        valueTab[2] = 5;
        valueTab[3] = 7;
        valueTab[4] = 1;
        valueTab[5] = 4;
        valueTab[6] = 4;
        valueTab[7] = 11;
        valueTab[8] = 3;
        valueTab[9] = 11;
        valueTab[10] = 11;
        valueTab[11] = 3;

        //Counting
            for (int valueIndex = 0; valueIndex < 12; valueIndex++)
            {
                if (valueTab[valueIndex] >= maxValue)
                {
                    maxValue = valueTab[valueIndex];
                    indexTab[indexIndex] = valueIndex;
                    indexIndex++;
                    for (indexIndex = 0; indexIndex < 12; indexIndex++)
                    {
                        if (indexTab[indexIndex] != 0)
                        {
                            richTextBox1.Text = indexTab[indexIndex].ToString();
                            richTextBox1.Text = Environment.NewLine;
                        }
                        else
                        {
                            richTextBox1.Text = "." + Environment.NewLine;
                        }
                    }
                    indexIndex = 0;
                }

            }

        }

1 个答案:

答案 0 :(得分:4)

第一次for ( k = 0; ...循环结束后,k的值为12.因此,您尝试分配j[k] j[12],其中k不在界限。

每次调用方法本身时for ( int i = 0; ...的值都设置为0,但在i = 0循环体开始之后它不会设置为0,所以从第一次执行(i = 1)到第二次执行(// find max values for (int i = 0; i < 12; i++) { if ( tab[i] > max ) k = 0; //reset position in target array for new max if ( tab[i] >= max ) { max = tab[i]; j[k] = i; k++; } } // print max values for (k = 0; k < 12; k++) { if (j[k] != 0) { richTextBox1.Text = j[k].ToString(); richTextBox1.Text = Environment.NewLine; } } )时,值12仍然存在。

您应该为变量指定一个描述性名称。它将帮助您和其他人更好地理解代码并避免许多问题。经过慎重的努力,我认为你想要的是以下内容:

private void PrintOutMaxValues() 
{
    int currentMax = 0;

    var input = new int[] { 3, 2, 5, 7, 1, 4, 4, 11, 3, 11, 11, 3 };
    var maxCounter = 0;

    // find max values
    for ( int inputIndex = 0; inputIndex < input.Length; inputIndex++) 
    {
        if ( input[ inputIndex ] > currentMax )
        {
           currentMax = input[ inputIndex ];
           maxCounter = 1;
        }
        else if ( input[ inputIndex ] == currentMax ) 
        {
           maxCounter++;
        }
    }

    //print out the maximum the number of times it occurred
    for ( var resultIndex = 0; resultIndex < maxCounter; resultIndex++) 
    {
        richTextBox1.Text += currentMax.ToString();
    }
}

现在看到相同的更多描述性变量名称和更少硬编码的魔法常量:

    REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',

    )
}

AND

JWT_AUTH = {
    'JWT_ENCODE_HANDLER':
    'rest_framework_jwt.utils.jwt_encode_handler',

    'JWT_DECODE_HANDLER':
    'rest_framework_jwt.utils.jwt_decode_handler',

    'JWT_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_payload_handler',

    'JWT_PAYLOAD_GET_USER_ID_HANDLER':
    'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',

    'JWT_RESPONSE_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_response_payload_handler',

    'JWT_SECRET_KEY': SECRET_KEY,
    'JWT_GET_USER_SECRET_KEY': None,
    'JWT_PUBLIC_KEY': None,
    'JWT_PRIVATE_KEY': None,
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,

    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),

    'JWT_AUTH_HEADER_PREFIX': ('JWT','Bearer'),
    'JWT_AUTH_COOKIE': None,

}

代码确实&#34;几乎&#34;同样的事情(因为我仍然不确定所需的ouptut),但正如你所看到的,给变量更长和更具描述性的名称使得更容易理解开发人员的结果和意图:-)。在编码的情况下,有时实际上更多,而不是更少;-)。编写一个字符变量名可以节省编写时间,但在尝试查找和修复无意中创建的错误时会花费更多。