多项式类在调试器中运行良好,但在尝试构建和运行时则不然

Polynomial Class runs fine in debugger but not when trying to build&run

本文关键字:构建 运行时 调试器 运行 多项式      更新时间:2023-10-16

所以我已经尝试解决这个问题好几个小时了,但没有成功。我有一个多项式方法的类(设置/获取等级,设置/获取多项式系数,打印多项式,为给定的一组数字找到每个y=f(x)等等)

然而,问题是,每当多项式的等级是偶数时,构建&run返回奇怪的值。它的调试运行得非常好。另一方面,每当级别不均匀时,无论是调试还是构建都可以完美地工作;跑我认为问题出在通常分配的内存上。这是代码。感谢

main.cpp

    #include "poly_header.h"

int main()
{
    Poly p;
    p.AfisareValori();
    return 0;
}

poly_header.h

#include <iostream>
#include <math.h>
using namespace std;

class Poly
{
private:
    int grad;
    int* coeficienti;
    int a;
    int b;
    int dx;
public:
    Poly();
    void SetGrad();
    int GetGrad();
    void SetCoef();
    void GetCoef();
    void SetPolyn();
    void PrintPoly();
    void SetInterval();
    void SetDistanta();
    void AfisareValori();
    ~Poly();
};

poly_functions.pp

#include "poly_header.h"
Poly::Poly()
{
    this->grad = 0;
    this->coeficienti = new int[0];
}
Poly::~Poly()
{
    delete coeficienti;
}
void Poly::SetGrad()
{
    int n;
    cout<<"Introduceti gradul dorit al polinomului: ";
    cin>>n;
    this->grad = n;
}
int Poly::GetGrad()
{
    cout<<"n";
    return this->grad;
}
void Poly::SetCoef()
{
    int n;
    this->coeficienti = new int[this->grad];
    for(int i = 0; i <= this->grad; i++){
        cout<<"Introduceti coeficientul "<<i<<" :";
        cin>>this->coeficienti[i];
        cout<<"n";
    }
}
void Poly::GetCoef()
{
    cout<<"n";
    for(int i = 0; i <= this->grad; i++)
        cout<<"Coeficientul asociat termenului x^"<<i<<" este:"<<this->coeficienti[i]<<"n";
}
void Poly::SetPolyn()
{
    SetGrad();
    SetCoef();
}
void Poly::PrintPoly()
{
    SetPolyn();
    for(int i = grad; i >= 0; i--){
        if(i == 0){
            cout<<coeficienti[i];
            break;
        }
        cout<<coeficienti[i]<<"*X^"<<i<<" + ";
    }
}
void Poly::SetInterval()
{
    int a,b;
    cout<<"Introduceti capatul din stanga al intervalului: ";
    cin>>a;
    this->a = a;
    cout<<"n";
    cout<<"Introduceti capatul din dreapta al intervalului: ";
    cin>>b;
    this->b = b;
    cout<<"n";
}
void Poly::SetDistanta()
{
    int dx;
    cout<<"Introduceti distanta dintre puncte: ";
    cin>>dx;
    this->dx = dx;
    cout<<"n";
}
void Poly::AfisareValori()
{
    SetPolyn();
    SetInterval();
    SetDistanta();
    int suma;
    for(int i = a; i <= b; i+=dx){
        suma = 0;
        for(int j = 0; j <= grad; j++){
            suma += coeficienti[j] * (pow (i,j));
        }
        cout<<"Valorea polinomului in punctul "<<i<<" este "<<suma<<"n";
    }
}

次多项式p(用你的话来说是"rad")N有N+1个系数;

在伪代码中:

length((N, N-1, ... 1, 0)) = N + 1.

因此这个

void Poly::SetCoef()
{
    /*...*/ 
    this->coeficienti = new int[this->grad];
    /*...*/ 
)

少分配一个int。

偶数次多项式有奇数N个系数,奇数次多项式有偶数个系数。

如果你分配的int太少,奇数次多项式的桶太少,位于2*sizeof(int)内存对齐的边界;因此,该铲斗很可能没有以其他方式使用。

这甚至不能持续几度,他们丢失的铲斗在一个新的对齐块内。

这也是调试和发布模拟之间差异的解释;调试编译器运行只是将内存压缩得不如发布编译器密集。

除此之外,您根本不必为了您的目的而处理手动字段分配;例如CCD_ 2和CCD_。