0

Не понимаю почему выхожу за массив.

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; 
}

Kromster
  • 13,809

1 Answers1

1

В массиве длины 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.

Как исправить? Зависит от логики вашего алгоритма:

  1. Либо нужно просто удалить строчку size_quotient = size_quotient + 1;
  2. Либо нужно создавать массив quotient уже увеличенного на 1 размера: Array.Resize(ref quotient, size_quotient + 1); (можно просто перенести строку size_quotient = size_quotient + 1; до строки Array.Resize(...))
  3. Либо изменить инициализацию переменной цикла на: for (int k = size_quotient - 2; ...).
Max S
  • 655
  • 1
  • 13