#c# #arrays #visual-studio-2010
#c# #массивы #visual-studio-2010
Вопрос:
Я чувствую себя идиотом, спрашивая об этом, но я ни за что на свете не могу понять, почему происходит это исключение 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;
, и в отладчике перед выполнением этого оператора все массивы и коллекции совпадений должным образом инициализируются и заполняются, включая intEnd[]
! Я отладил, чтобы убедиться, что массив существует и инициализирован, а также очистил решение и перестроил его.
У кого-нибудь есть какие-либо предложения относительно того, что здесь происходит??
Ответ №1:
Я считаю, что ошибка на самом деле находится в этой строке
intTablePairs[i, 1, 0] = intEnd[j];
Проблема здесь в том, что вы определили длину последних 2 измерений, чтобы оба были равны 1 intTablePairs
. Следовательно, использование индекса 1 недопустимо, поскольку оно равно длине. Похоже, вы хотели определить границы как
int[,,] intTablePairs = new int[mcBegin.Count, 2, 2];
Комментарии:
1. @AS-CII это не может быть ошибкой, хотя в противном случае строка непосредственно над ней также будет ошибкой. Оба доступа
intEnd[j]
.2. Я не писал, что ваше решение было неправильным 😉 Я подумал, что он допустил ошибку, скопировав свой код в StackOverflow.
3. @AS-CII это определенно может быть так. Придется подождать и посмотреть, что скажет OP 🙂
4. Ах. Отладчик выделял строку под ним, но вы правы, ошибка возникает в указанной вами строке. BRB.
5. У меня была возможность протестировать его … конечно, это была проблема! Спасибо!!
Ответ №2:
Может быть, посмотрите на это:
int[] intEnd = new int[mcBegin.Count];
Замените mcBegin на mcEnd и попробуйте.
Ответ №3:
Я полагаю intEnd
, должно быть установлено mcEnd.Count
значение capacity . Поэтому вместо:
int[] intEnd = new int[mcBegin.Count];
У вас должно быть:
int[] intEnd = new int[mcEnd.Count];
Надеюсь, это поможет.