Стек вокруг переменной поврежден, проблема с ++

0

У меня есть небольшая проблема с этой программой, которую я делаю. Основная цель этой программы, которую я делаю, состоит в том, чтобы получить 2 многочлена и sum/sub/multiply it,

Еще не закончили выходные и основные() части, только на самом коде,

Когда я пытаюсь использовать часть умножения, я получаю эту ошибку: стек вокруг переменной "a" поврежден,

Не знаю, что я сделал неправильно.... взял меня на 1 час, чтобы подумать об этом и написать это, но всего 2 часа, пытаясь исправить это, но не может никуда уйти.

class PolyNomial
{
    int printcounter;
    double *coefficients;
    int degree;
public:
    PolyNomial()//the default constructor to initialize a polynomial equal to 0
    {
        degree = 0;
        coefficients = new double[degree + 1];
        coefficients[0] = 0;
    }
    PolyNomial(double y[], int x)//the constructor to initialize a polynomial with the given coefficient array and degree
    {
        degree = x;
        if (degree>10)
            {
                cout<<"Error : The PolyNomial Degree is bigger than 10 and can not be shown in this program";
            }
        else 
            {
                int c=0;
                coefficients = new double[degree + 1];

                for(c=0;c<=degree;c++)
                    {
                        coefficients[c] = y[c];
                    }
            }
    }

    void add(PolyNomial p)
    {
        int i;
        if ( degree < p.degree )
            {
                i = p.degree;
                printcounter = p.degree;
            }
        else
            {
                i = degree;
                printcounter = degree;
            }
        for(;i>=0;i--)
            {
                coefficients[i] = coefficients[i] + p.coefficients[i];
            }

    }

    void sub(PolyNomial p)
    {
        int i;
        if ( degree < p.degree )
            {
                i = p.degree;
                printcounter = p.degree;
            }
        else
            {
                i = degree;
                printcounter = degree;
            }
        for(;i>=0;i--)
            {
                coefficients[i] = coefficients[i] - p.coefficients[i];
            }

    }
    void print()
    {
        int i;
        for(i=0;i<=printcounter;i++)
            cout<<coefficients[i]<<"    ";
    }

    void Multiply(PolyNomial p)
    {
        int i,j;
        i = degree;
        j = p.degree;

        double a[100];
        int counter;
        for ( counter = 0 ; counter <= i+j; counter++)
            {
                a[counter]=0;
            }
        int x= i+ j ;

        for(;i>=0;i--)
            {
                for(;j>=0;j--)
                    if (i+j>=10)
                        {
                            cout<<"Error : The PolyNomial Degree is bigger than 10 and can not be shown in this program";
                            break;
                        }
                a[i+j] = a[i+j]  + ( coefficients[i] * p.coefficients[j] );

            }
        PolyNomial k(coefficients,x);

        k.print();
    }
};


int main()
{
    double a[100];
    int x,i;
    cout<<"Enter the PolyNomial Degree : ";
    cin>>x;
    cout<<"\nEnter the coefficients one by one by , from bigger to smaller : ";
    for ( i=0 ; i<=x ; i++ )
        {
            cin>>a[i];
        }


    PolyNomial p(a,x);

    cout<<"\n\nEnter the PolyNomial Degree : ";
    cin>>x;
    cout<<"\nEnter the coefficients one by one by , from lowest degree to highest : ";
    for ( i=0 ; i<=x ; i++ )
        {
            cin>>a[i];
        }


    PolyNomial o(a,x);
    _getch();
    //  p.add(o);
    p.Multiply(o);
    // p.print();
    _getch();
    //  p.sub(o);
    //  p.Multiply(o);

}
  • 0
    У вас есть более одной переменной с именем «а». Начните с того, что дайте каждому более осмысленное и уникальное имя, и это сузит его для вас.
  • 0
    В момент, когда вы создаете новый полином k (в умножении), вы используете степень x == i + j и кормите ее coefficients массива, имеющими размер i . Это может или не может вызвать проблемы, но это, скорее всего, ошибка.
Показать ещё 1 комментарий
Теги:
polynomial-math

4 ответа

2

Эта строка

a[i+j] = a[i+j]  + ( coefficients[i] * p.coefficients[j] );

не находится внутри цикла for j (вы не использовали {и}, чтобы заключить его}. Это означает, что j является -1, когда он запускается. Если я равно 0, вы назначаете [-1], который вызывает сообщение об ошибке стека.

Обратите внимание, что вы также не сбрасываете j каждый раз вокруг цикла i, поэтому внутренний цикл будет выполняться только один раз.

0

Хорошо, теперь tnx ко всем ответам и комментариям, которые я получил, мой код работает, но доза не делает работу правильно,

Пример: если я сначала добавлю многочлен 2 степени, а затем 3 степени, как это:

1 2 3
1 2 3 4

Результатом будет:

0 0 3 6 9 12

Это только одна часть многократных процессов,

Добавленный 2 многочлен: 3x ^ 2 + 2x ^ 1 + 1 4x ^ 3 + 3x ^ 2 + 2x ^ 1 + 1

Вот новый код:

class PolyNomial
{
    int printcounter;
    double *coefficients;
    int degree;
public:
    PolyNomial()//the default constructor to initialize a polynomial equal to 0
{
     degree = 0;
    coefficients = new double[degree + 1];
    coefficients[0] = 0;
}
PolyNomial(double y[], int x)//the constructor to initialize a polynomial with the given coefficient array and degree
{
    degree = x;
    if (degree>10)
    {
        cout<<"Error : The PolyNomial Degree is bigger than 10 and can not be shown in this program";
    }
    else 
    {
        int c=0;
        coefficients = new double[degree + 1];

        for(c=0;c<=degree;c++)
        {
            coefficients[c] = y[c];
        }
    }
}

void add(PolyNomial p)
{
    int i;
    if ( degree < p.degree )
    {
        i = p.degree;
        printcounter = p.degree;
    }
    else
    {
        i = degree;
        printcounter = degree;
    }
    for(;i>=0;i--)
    {
        coefficients[i] = coefficients[i] + p.coefficients[i];
    }

}

void sub(PolyNomial p)
{
    int i;
    if ( degree < p.degree )
    {
        i = p.degree;
        printcounter = p.degree;
    }
    else
    {
        i = degree;
        printcounter = degree;
    }
    for(;i>=0;i--)
    {
        coefficients[i] = coefficients[i] - p.coefficients[i];
    }

}
void print()
{
    int i;
    for(i=0;i<=printcounter;i++)
        cout<<coefficients[i]<<"    ";
}

void Multiply(PolyNomial p)
{
    int i,j;
    i = degree;
    j = p.degree;

    double mult[100];
    int counter;
    for ( counter = 0 ; counter <= i+j; counter++)
    {
        mult[counter]=0;
    }
    int x= i+ j ;

    for(;i>=0;i--)
    {
        for(;j>=0;j--)
        {
            if (i+j>=10)
            {
                cout<<"Error : The PolyNomial Degree is bigger than 10 and can not be shown in this program";
                break;
            }
            mult[i+j] = mult[i+j]  + ( coefficients[i] * p.coefficients[j] );
        }

    }
    PolyNomial k(mult,x);
    k.printcounter = x;
    k.print();

    }
};


int main()
{
    double a[100];
    int x,i;
    cout<<"Enter the PolyNomial Degree : ";
   cin>>x;
   cout<<"\nEnter the coefficients one by one by , from lowesr degree to highest : ";
   for ( i=0 ; i<=x ; i++ )
{
    cin>>a[i];
}


PolyNomial p(a,x);

cout<<"\n\nEnter the PolyNomial Degree : ";
cin>>x;
cout<<"\nEnter the coefficients one by one by , from lowest degree to highest : ";
for ( i=0 ; i<=x ; i++ )
{
    cin>>a[i];
}


    PolyNomial o(a,x);
    _getch();
//  p.add(o);
    p.Multiply(o);
//  p.print();
    _getch();
//  p.sub(o);
//  p.Multiply(o);

}
0

В C и C++ локальные переменные обычно хранятся в стеке, небольшая (иш) область памяти, которую программы используют для хранения данных уровня локального/функционального уровня; когда исполняемый вызов вызывает функцию, процессор использует стек для хранения адреса, из которого выполняется вызов, а затем переходит к подпрограмме. Когда подпрограмма завершается, если она очистила стек, то она должна вернуться к состоянию, где верхнее значение стека - это адрес, на который ему нужно вернуться, чтобы возобновить обработку.

В то же время программы C/C++ используют стек для хранения локальных переменных - принцип заключается в том, что при выходе из подпрограммы все переменные уходят очень элегантно.

Ваши переменные "a" являются локальными переменными, они находятся в стеке. Поскольку они представляют собой массивы, это означает, что если вы пишете вне пределов массива, вы будете перезаписывать области стека, используемые другими переменными или, возможно, даже процессором для отслеживания обратного адреса.

Ваши переменные "a" имеют 100 элементов. Этот массив образует единый непрерывный блок:

{a[0]}{a[1]}...{a[99]}

Если вы пишете "a [100]", вы пишете конец конца массива и другую переменную память или, возможно, обратный адрес функции.

Возможно, вам захочется использовать [std::array][1] или [std::vector][2].

0

В то время, когда вы создаете свой многочлен, вы создаете массив коэффициентов с размером degree + 1. Все идет нормально. Теперь, если вы добавите два многочлена, вы просто добавляете коэффициенты, но не учитываете выделенное пространство. Если полином с наименьшей степенью должен быть результатом добавления, вы столкнетесь с проблемой

Ещё вопросы

Сообщество Overcoder
Наверх
Меню