CData中有两个成员函数:
double CData::PIs(double xTime[],double yValue[],int m,int n,double* m_pLsy0,double* m_pXAve)
{
//传入时间和变量值
//其中m为作最小二乘的起始点参数,n为作最小二乘的终点值参数
double sxx=0,sxy=0,syy=0; //初始化最小二乘的参数
double av_x=0,av_y=0,y0=0; //初始化最小二乘的参数
int Plsstart=m,Plsend=n; //传入做最小二乘元素起始点,中止点
for(int i=Plsstart;i<Plsend;i++) //计算最小二乘估计均值参数
{
av_x+=xTime[i]/(Plsend-Plsstart); //计算时间均值
av_y+=yValue[i]/(Plsend-Plsstart); //计算变量的均值
}
for(int j=Plsstart;j<Plsend;j++) //计算最小二乘的参数
{
sxx+=(xTime[j]-av_x)*(xTime[j]-av_x); //计算的参数
sxy+=(xTime[j]-av_x)*(yValue[j]-av_y); //计算的参数
}
m_slope=sxy/sxx; //计算拟合曲线的斜率
*m_pLsy0=av_y; //y均值
*m_pXAve=av_x; //x均值
return m_slope; //返回曲线的斜率
}
CData::PaintLSM(CDC *pDC)
{
CPen aPen;
aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen* pOldPen=pDC->SelectObject(&aPen);
for(int j=0;j<10;j++)
{
pDC->MoveTo(70+0.9*j,670-2*(*m_pLsy0+m_slope*(j-*m_pXAve)));
pDC->LineTo(70+0.9*(j+1),670-2*(*m_pLsy0+m_slope*((j+1)-*m_pXAve)));
// pDC->MoveTo(70+0.9*j,670-2*(100+m_slope*(j-4.5)));
// pDC->LineTo(70+0.9*(j+1),670-2*(100+m_slope*((j+1)-4.5)));
}
pDC->SelectObject(pOldPen);
}data.PaintLSM(pDC)中要用到CData中的成员变量m_pLsy0和m_pXAve中所指向位置所存放的值,而这两个值由data.PIs计算得到。
但现在调试时出现问题,换成//注释行中的代码却可以,请问应该如何修改?
double CData::PIs(double xTime[],double yValue[],int m,int n,double* m_pLsy0,double* m_pXAve)
{
//传入时间和变量值
//其中m为作最小二乘的起始点参数,n为作最小二乘的终点值参数
double sxx=0,sxy=0,syy=0; //初始化最小二乘的参数
double av_x=0,av_y=0,y0=0; //初始化最小二乘的参数
int Plsstart=m,Plsend=n; //传入做最小二乘元素起始点,中止点
for(int i=Plsstart;i<Plsend;i++) //计算最小二乘估计均值参数
{
av_x+=xTime[i]/(Plsend-Plsstart); //计算时间均值
av_y+=yValue[i]/(Plsend-Plsstart); //计算变量的均值
}
for(int j=Plsstart;j<Plsend;j++) //计算最小二乘的参数
{
sxx+=(xTime[j]-av_x)*(xTime[j]-av_x); //计算的参数
sxy+=(xTime[j]-av_x)*(yValue[j]-av_y); //计算的参数
}
m_slope=sxy/sxx; //计算拟合曲线的斜率
*m_pLsy0=av_y; //y均值
*m_pXAve=av_x; //x均值
return m_slope; //返回曲线的斜率
}
CData::PaintLSM(CDC *pDC)
{
CPen aPen;
aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen* pOldPen=pDC->SelectObject(&aPen);
for(int j=0;j<10;j++)
{
pDC->MoveTo(70+0.9*j,670-2*(*m_pLsy0+m_slope*(j-*m_pXAve)));
pDC->LineTo(70+0.9*(j+1),670-2*(*m_pLsy0+m_slope*((j+1)-*m_pXAve)));
// pDC->MoveTo(70+0.9*j,670-2*(100+m_slope*(j-4.5)));
// pDC->LineTo(70+0.9*(j+1),670-2*(100+m_slope*((j+1)-4.5)));
}
pDC->SelectObject(pOldPen);
}data.PaintLSM(pDC)中要用到CData中的成员变量m_pLsy0和m_pXAve中所指向位置所存放的值,而这两个值由data.PIs计算得到。
但现在调试时出现问题,换成//注释行中的代码却可以,请问应该如何修改?
*m_pLsy0=100;
*m_pXAve=4.5;
调用顺序也没有错。还有什么别的可能吗?
int iXAve = *m_pXAve;
TRACE("%d %d\r\n", iLSY0, iXAve); //在output窗口看这个值对否
for(int j=0;j <10;j++)
{
pDC->MoveTo(70 + 0.9 * j, 670 - 2*(iLSY0 + m_slope*(j - iXAve )));
pDC->LineTo(70 + 0.9 * (j + 1), 670 - 2*(iLSY0 + m_slope*((j + 1) - iXAve )));
}
并且我无论是在TRACE还是在for前设断点,就会:
Unhandle exception in QTA.exe:0x0000005:Access Violation.
if(m_LSMCurve)
{
data.m_pLsy0 = m_Plsy0;
data.m_pXAve = m_xAve;
data.PaintLSM(pDC);
}