问题描述
我有一个类为Solver
的QT应用程序,它解决了一些数值问题(通过查找多项式分布到三项式来找到多项式根的Bairstow方法),但是对于较小的实例(5个参数,在数组{{1中}})工作正常,但是当我尝试使用较大的实例(7个参数)时,应用程序崩溃了。
运行调试器后,我收到以下消息:
tabA
我不确定到底是怎么回事(嗯,我想我会堆栈溢出,但是我不确定在哪里和如何),但是它指向第Heap block at 02989F58 modified at 02989F80 past request 20
行,这是调试器指出的方式:
这是该类方法的代码(错误发生在主方法delete[] Q; delete[] W;
中,该方法在类字段上工作并返回数字,指示找到解决方案,不存在或在给定的迭代次数中找不到该数字) )
这是主要方法:
int Bairstow(*parameters*)
和两种帮助方法:
- 用于多项式除法(按三项式x ^ 2-px-r)
int solver::Bairstow(int stopien,double const *tabA,double *tabP,double *tabR,double eps,int N,double p_,double r_)
{
int i,q,Iter,indpziel=0;
i=stopien;
while(i>=0 && tabA[i]==0)
{
i--;
}
if (i<2) { return 1; }
double *A=new double[stopien +1]
for (i=0;i<=stopien;i++)
{
A[i]=tabA[i];
}
double *Q=new double[stopien-1 +1];
double *w=new double[stopien-3 +1];
double Reszta[2];
double dqdp[2],dqdr[2];
double p,r,a,b,c,d;
while (stopien>=2)
{
p=p_,r=r_;
Iter=O;
do
{
PodzielWiel(stopien,A,p,Q,Reszta);
if (fabs(Reszta[1])<eps && fabs(Reszta[0])<eps)
{
break;
}
PodzielWiel(Stopien-2,W,dqdr);
for (i=Stopien-2;i>=0;i--)
{
Q[i+1]=Q[i];
}
Q[0]=0;
PodzielWiel(Stopien-1,dqdp);
q=LiczMOdwrotna(dqdp[0],dqdr[0],dqdp[1],dqdr[1],d);
if (q==1)
{
delete[] Q;
delete[] W;
return 2;
}
p = p-(a*Reszta[0]+b*Reszta[1]);
r = r-(c*Reszta[0]+d*Reszta[1]);
} while (++Iter<N);
if (Iter==N) return 3;
tabP[IndDziel]=p;
tabR[IndDziel]=r;
IndDzieL++;
Stopien-=2;
for (i=0;i<=Stopien;i++)
{
A[i]=Q[i];
}
}
delete[] Q; delete[] W; //that's the line debugger pointed to
return 0;
}
- 用于反转2x2矩阵(前4个参数为输入,后4个参数为输入):
int solver::PodzielWiel(int stopien,double p,double r,double *Q,double *R)
{
if (Stopien<O) return 1;
int i;
for (i=0;i<=stopien-2;i++)
{
Q[i]=0;
}
while (stopien>=0 && tabA[stopien]==0)
{
stopien--;
}
if (stopien<2)
{
R[0]=tabA[0];
R[1]=tabA[1];
return 0;
}
double *A=new double[Stopien +1];
for (i=0;i<=stopien;i++)
{
A[i]=tabA[i];
}
Q[stopien-2]=A[stopien];
if (stopien>2)
{
for(i=stopien; i>1; i--)
{
Q[i-2]=A[i];
A[i-1]+=Q[i-2]*p;
A[i-2]+=Q[i-2]*r;
}
R[1]=A[1];
R[0]=A[0] ;
}
else
{
R[1]=A[1]+P*Q[0] ;
R[0]=A[0]+r*Q[0] ;
}
delete [] A;
return 0;
}
担心格式可能不正确,但我不得不使用OCR软件,因为不可能从QT Creator中进行复制...即使在资源管理器中使用show之后,在新的本地化中将文件另存为txt(以使其在QT Creator外部可见),然后再做一次...我仍然无法复制任何内容...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)