ошибка компиляции: индекс вне диапазона - PullRequest
1 голос
/ 18 декабря 2010

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

    private void button3_Click(object sender, EventArgs e)
    {


        string[] source = textBox1.Text.Split(',');
        string[] source1 = textBox3.Text.Split(',');
        int[] nums2 = new int[source1.Length + source.Length];
        int[] nums = new int[source.Length];
        for (int i = 0; i < source.Length; i++)
        {
            nums[i] = Convert.ToInt32(source[i]);

        }
        int[] nums1 = new int[source1.Length];
        for (int j = 0; j < source1.Length; j++)
        {
            nums1[j] = Convert.ToInt32(source1[j]);
        }
        int x=0;
        int y=0;
           int z=0;

        while (x <=nums.Length && y <= nums1.Length)
        {
            if (nums[x] <= nums1[y])///it gives out of range on this line
            {
                nums2[z] = nums[x];
                x++;

            }
            else
            {
                nums2[z] = nums1[y];
                y++;
            }

            z++;
        }
        if (x > nums.Length)
        {
            while (y <= nums1.Length)
            {
                nums2[z] = nums1[y];

                z++;
                y++;
            }
            if (y > nums1.Length)
            {
                while (x <= nums.Length)
                {
                    nums2[z] = nums[x];
                    z++;
                    x++;
                }
            }
        }
        string merge = nums2[z].ToString();

       textBox4.Text = merge;

    }
}

Ответы [ 3 ]

4 голосов
/ 18 декабря 2010

Во-первых, IndexOutOfRangeException - это не ошибка компиляции , а время выполнения ошибка.

Индексы в массиве основаны на 0. Это означает, например, что массив длины 3 имеет индексы 0, 1 и 2, но индекс 3 не существует и находится вне диапазона. Чтобы исправить ошибку, измените <= на < в следующих строках:

while (x < nums.Length && y < nums1.Length)

while (y < nums1.Length)

while (x < nums.Length)

и т.д ...

В вашей программе могут быть и другие ошибки - это была только первая ошибка, которую я видел.

1 голос
/ 18 декабря 2010

Массивы начинаются с нуля в C # , что означает, что первый элемент в массиве имеет индекс 0, а не индекс 1.

Однако свойство Length возвращает единичный счетчик количества объектов в массиве. Поэтому, когда вы пишете x <= nums.Length, вы на самом деле пытаетесь получить доступ к индексу, который находится за пределами массива.

Вместо этого вам следует переписать этот раздел кода следующим образом:

    while (x < nums.Length && y <  nums1.Length)
    {
        if (nums[x] <= nums1[y])
        {
            nums2[z] = nums[x];
            x++;

        }

    // etc.
0 голосов
/ 18 декабря 2010

Индекс начинается с 0, поэтому вы должны сделать:

while (x < nums.Length && y < nums1.Length)
...