Выход за массив в алгоритме деления
Не понимаю почему выхожу за массив.
public void Div_Polynomials(double[] pol1, double[] pol2, CancellationToken cancelToken) //деление полинмов
{
double[] quotient = { }; // делимое
double[] mod = { }; // остаток от деления
int size_quotient = pol1.Length - pol2.Length;
int size_mod = pol2.Length - 1;
//pol1.Length - n
//pol2.Length - m
Array.Resize(ref quotient, size_quotient);
Array.Resize(ref mod, size_mod);
size_quotient = size_quotient + 1;
size_mod = size_mod + 1; //может быть непраивльно
/*
void division(int* arr1, int n, int* arr2, int m, int* result, int&nm) {
for (int k = (n - m); k >= 0; k--)
{
result[k] = arr1[k + m] / arr2[m];
for (int j = k + m - 1; j >= k; j--)
arr1[j] -= arr2[j - k] * result[k];
}
}
*/
for (int k = size_quotient-1; k >= 0 && !cancelToken.IsCancellationRequested; k--) //+
{ //первый многочлен
quotient[k] = pol1[pol2.Length - 1 + k] / pol2[pol2.Length - 1]; // коэфи
for (int j = pol2.Length + k - 1; j >= k; j--)
{ //второй многчлен
pol1[j] = pol1[j] - quotient[k] * pol2[j - k];
}
}
int g = 0;
for (int i = 0; i < size_mod - 1; i++)
{ //остаток
mod[i] = pol1[i];
g++;
}
result_polynomial = quotient;
result_quotient = quotient;
result_mod = mod;
}
Ответы (1 шт):
Автор решения: Max S
→ Ссылка
В массиве длины Length элементы индексируются от 0 до Length - 1.
Вы создаете массив double[] quotient длины size_quotient:
Array.Resize(ref quotient, size_quotient);
Затем вы этот size_quotient (зачем-то?) увеличиваете на 1 (длина массива при этот остается равна "старому" значению size_quotient!):
size_quotient = size_quotient + 1;
Но цикл у вас начинается с int k = size_quotient - 1:
for (int k = size_quotient-1; k >= 0 && !cancelToken.IsCancellationRequested; k--) //+
{
quotient[k] = pol1[pol2.Length - 1 + k] / pol2[pol2.Length - 1];
// ...
}
В итоге на первой итерации вы обращаетесь к элементу Length массива quotient и получаете закономерное исключение ArgumentOutOfRangeException.
Как исправить? Зависит от логики вашего алгоритма:
- Либо нужно просто удалить строчку
size_quotient = size_quotient + 1; - Либо нужно создавать массив
quotientуже увеличенного на 1 размера:Array.Resize(ref quotient, size_quotient + 1);(можно просто перенести строкуsize_quotient = size_quotient + 1;до строкиArray.Resize(...)) - Либо изменить инициализацию переменной цикла на:
for (int k = size_quotient - 2; ...).