Member 12662633 Ответов: 2

Как я могу исправить ошибку здесь.


static void Main(string[] args)
{
    byte[] barr = GenerateRandomArrForByte(1000);
    WriteArr(barr);

    byte[] countArr = SortByteArr(barr);
    WriteArr(countArr);

    Console.ReadLine();
}

static byte[] GenerateRandomArrForByte(int n)
{
    byte[] arr = new byte[n];
    Random rnd = new Random();
    for (int i = 0; i < n; i++)
    {
        arr[i] = (byte)rnd.Next(0, 256);
    }
    return arr;
}

static void WriteArr(byte[] arr)
{
    for (int i = 0; i < arr.Length; i++)
    {
        Console.WriteLine("arr[{0}] = {1}",i,arr[i]);
    }
}

static byte[] SortByteArr(byte[] arr)
{
    int[] countArr = new int[256];
    foreach (byte a in arr)
    {
        countArr[a]++;
    }

    int index = 0;
    byte[] arr1 = new byte[arr.Length];
    for (byte i = 0; i < countArr.Length; i++)
    {
        int count = countArr[i];
        for (int j = 0; j < count; j++)
        {
            arr1[index] = i;
            index++;
        }
    }
    return arr1;
}


Что я уже пробовал:

Это принесло эту ошибку "индекс находился за пределами массива."
здесь
arr1[индекс] = i;

Richard MacCutchan

Поэтому используйте свой отладчик, чтобы узнать, какое значение было удержано index и это будет проблемой.

Member 12662633

Я пробовал с разными массивами и не было никаких проблем
Но в данном случае все было так
arr1[1000] = 0;
ошибка произошла, когда индекс был равен 1000.

PIEBALDconsult

Конечно, это так-эти индексы варьируются от 0 до 999.

Member 12662633

но когда я меняю оба 256 на 255, это работает.

2 Ответов

Рейтинг:
6

Patrice T

Цитата:
Это принесло эту ошибку "индекс находился за пределами массива."
здесь
arr1[index] = i; 

Смысл довольно очевиден: index используется для доступа к элементу после окончания массива.

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
19

OriginalGriff

Давайте начнем с рассмотрения ошибки и того, что она означает:

Index was outside the bounds of the array

Это означает, что вы попытались использовать числовой индекс для доступа к несуществующему элементу массива - значение "индекса" отрицательно, больше, чем самый большой индекс, который может иметь массив, - то есть количество элементов в массиве минус один, потому что индексы массива C# всегда начинаются с нуля.
Если бы ваш стол был массивом ящиков и имел три розыгрыша, индексы были бы равны 0, 1 и 2 - попробуйте получить доступ к ящикам[3] или ящикам[4], но их не существует, поэтому вы получите ошибку.

Теперь посмотрите на свой код:
static byte[] SortByteArr(byte[] arr)
{
    int[] countArr = new int[256];
    foreach (byte a in arr)
    {
        countArr[a]++;
    }

    int index = 0;
    byte[] arr1 = new byte[arr.Length];
    for (byte i = 0; i < countArr.Length; i++)
    {
        int count = countArr[i];
        for (int j = 0; j < count; j++)
        {
            arr1[index] = i;
            index++;
        }
    }
    return arr1;
}

Ваша внешняя петля идет по кругу, пока i меньше, чем размер вашего массива count-который равен 256 раз: я буду от 0 до 255 включительно. Внутри этого у вас есть второй цикл, который будет повторяться столько раз, сколько значение в каждом элементе: поэтому, если бы все элементы были одним, Вы бы выполнили код внутри внутреннего цикла 256 * 1 раз, и все они были 2, он бы выполнил 256 * 2 раза == 512.
И внутри этого внутреннего цикла вы используете индекс в aar1 и увеличиваете его-так что вам нужно иметь достаточное количество элементов в arr1, чтобы обойти потенциально огромное количество раз! А поскольку ваш arr1 будет состоять из 1000 элементов, и каждый элемент получит число от 0 до 255, вам нужно, чтобы arr имел среднее значение 256 * 128 элементов (256 раз вокруг внешнего цикла умножается на среднее значение в массиве).

Если этот код должен сортировать массив, как следует из названия, он не делает хорошую работу...
Я бы посоветовал вам научиться пользоваться отладчиком и разработать гораздо лучший алгоритм сортировки!


Member 12662633

но когда я меняю оба 256 на 255, это работает.