Почему этот массив int создает исключение IndexOutOfRangeException? - PullRequest
2 голосов
/ 20 октября 2011

Я чувствую себя идиотом, когда спрашиваю об этом, но не могу понять, почему происходит это исключение IndexOutOfRangeException. (Я имею в виду, я знаю, ПОЧЕМУ это происходит, я просто не знаю, что недопустимо в моем коде) Проверьте код ниже, чтобы узнать, где выдается ошибка:

public int[, ,] FindTablePairings(System.Text.RegularExpressions.MatchCollection mcBegin, System.Text.RegularExpressions.MatchCollection mcEnd)
    {
        int[,,] intTablePairs = new int[mcBegin.Count, 1, 1];
        int[] intBegin = new int[mcBegin.Count];
        int[] intEnd = new int[mcBegin.Count];

        for (int q = 0; q < mcBegin.Count; q++)
        {
            intBegin[q] = mcBegin[q].Index;
        }
        for (int q = 0; q < mcEnd.Count; q++)
        {
            intEnd[q] = mcEnd[q].Index;
        }

        int intBeginCount = mcBegin.Count;
        int intEndCount = mcEnd.Count;
        int i = 0;
        int j = 0;
        int k = 0;

        while (i < intBeginCount)
        {
            j = i;
            while (j < intEndCount)
            {
                if (intBegin[i + 1] < intEnd[j])
                {
                    j++;
                }
                else
                {
                    intTablePairs[i, 0, 0] = intBegin[i];
                    intTablePairs[i, 1, 0] = intEnd[j];
                    intEnd[j] = -1;                         //EXCEPTION OCCURS HERE
                    break;
                }
            }
            if (j == intEndCount)
            {
                intTablePairs[i, 0, 0] = intBegin[i];
                intTablePairs[i, 1, 0] = intEnd[j - 1];
                intEndCount--;
            }

            while (k < intEndCount)
            {
                if (intEnd[k] == -1)
                {
                    k++;
                }
                else
                {
                    intTablePairs[i,0,0] = intBegin[i];
                    intTablePairs[i,1,0] = intEnd[k];
                    intEnd[k] = -1;
                    k=0;
                    break;
                }
            }
        }

        return intTablePairs;
    }

Код просто просматривает индексы символов появления начальных и конечных тегов. Ничего сверхсложного ... но хуже всего то, что исключение выдается на intEnd[j] = -1;, а в отладчике перед выполнением этого оператора все массивы и MatchCollections правильно инициализируются и заполняются, включая intEnd[]! Я отладил, чтобы убедиться, что массив существует и инициализирован, а также очистил решение и перестроил его.

Кто-нибудь есть какие-либо предложения относительно того, что здесь происходит ??

Ответы [ 3 ]

5 голосов
/ 20 октября 2011

Я полагаю, что ошибка на самом деле в этой строке

intTablePairs[i, 1, 0] = intEnd[j];

Проблема здесь в том, что вы определили длину последних двух измерений, чтобы они были равны 1 на intTablePairs.Следовательно, использование индекса 1 недопустимо, так как он равен длине.Кажется, вы хотели определить границы как

int[,,] intTablePairs = new int[mcBegin.Count, 2, 2];
0 голосов
/ 20 октября 2011

Полагаю, intEnd должно быть установлено с емкостью mcEnd.Count.Поэтому вместо:

int[] intEnd = new int[mcBegin.Count];

Вы должны иметь:

int[] intEnd = new int[mcEnd.Count];

Надеюсь, это поможет.

0 голосов
/ 20 октября 2011

Может быть, посмотрите на это:

 int[] intEnd = new int[mcBegin.Count];

Замените mcBegin на mcEnd и попробуйте.

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