Я получаю ошибку System.ArgumentOutOfRangeException в C#? - PullRequest
0 голосов
/ 07 мая 2020

Я работаю над школьным заданием, где мне нужно преобразовать 8-битное двоичное число в десятичное. Это мой код;

         private void btnCalculate_Click(object sender, EventArgs e)
        {
            string invoer = txtBoxInput.Text;

            // binair naar decimaal
            if (rdBtnBinair.Checked == true)
            {
                int invoerlengte = invoer.Length;
                double nieuwgetal = 0;
                for (int i = 0; i <= invoerlengte; i++)
                {
                    if (int.Parse(invoer.Substring(i, 1)) == 1)
                    {
                        nieuwgetal += Math.Pow(2,(i+1));
                    }
                }
                txtBoxOutput.Text = nieuwgetal.ToString();

In C#. Ошибка, которую я получаю: System.ArgumentOutOfRangeException: индекс и длина должны относиться к местоположению в строке.

Думаю, мой код должен быть хорошим, не вижу, что не так. С уважением

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Вероятно, вы захотите изменить это:

for (int i = 0; i <= invoerlengte; i++)

на это:

for (int i = 0; i < invoerlengte; i++)

Потому что, когда i равно invoer.Length, следующая строка кода будет ищем следующий символ после конца строки, который находится вне допустимого диапазона:

invoer.Substring(i, 1)
0 голосов
/ 07 мая 2020
private void btnCalculate_Click(object sender, EventArgs e)
        {
            string invoer = txtBoxInput.Text;
            int invoerlengte = invoer.Length;
            double nieuwgetal = 0;
            if (rdBtnBinair.Checked == true)
            {
                for (int i = 1; i <= invoerlengte; i++)
                {
                    if (int.Parse(invoer.Substring(invoerlengte - (1 * i), 1)) == 1)
                    {
                        nieuwgetal += Math.Pow(2, (i - 1));
                    }
                }
            }

            txtBoxOutput.Text = nieuwgetal.ToString();

        }

Это решение, и теперь оно работает. Пока!

0 голосов
/ 07 мая 2020

Это потому, что ваш foreach выполняет одну итерацию слишком много, потому что вы используете <= вместо '<'. </p>

В этих случаях всегда полезно проверить, что и когда происходит. Вы можете сделать это с помощью отладчика или простого старого Console.WriteLine (или debug.log w / e)

онлайн-образец: https://dotnetfiddle.net/UyE2rw

    public static void Main()
    {
        var invoer = "12345";
        int invoerlengte = invoer.Length;
                double nieuwgetal = 0;
                for (int i = 0; i <= invoerlengte; i++)
                {
                    Console.WriteLine("i: " + i + ", substring: " + invoer.Substring(i, 1));

                    if (int.Parse(invoer.Substring(i, 1)) == 1)
                    {
                        nieuwgetal += Math.Pow(2,(i+1));
                    }
                }

    }

выводит:

i: 0, substring: 1
i: 1, substring: 2
i: 2, substring: 3
i: 3, substring: 4
i: 4, substring: 5
Run-time exception (line 13): Index and length must refer to a location within the string.
Parameter name: length

Stack Trace:

[System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length]
   at System.String.Substring(Int32 startIndex, Int32 length)
   at MyApp.Main() :line 13

и будьте внимательны - индексы начинаются с 0, считая с 1. Таким образом, substring (0,1) является символом с индексом 0, но является первым элементом (char) в массиве строк .

item1 находится в index0, item2 находится в index1 et c.

De groetjes!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...