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计算得到。
但现在调试时出现问题,换成//注释行中的代码却可以,请问应该如何修改?

解决方案 »

  1.   

    跟踪看看m_pLsy0  是否有效
      

  2.   

    应该有效吧!我都可以得到它所存放的值:
    *m_pLsy0=100; 
    *m_pXAve=4.5;  
      

  3.   

    是不是这两个指针没初始化就调用了PaintLSM ,看看PaintLSM 和PIs的调用顺序,如果这两个值没问题,那没可能出错
      

  4.   

    这两个指针都在构造函数里初始化了,设为NULL;
    调用顺序也没有错。还有什么别的可能吗?
      

  5.   

    改成这样   调试看看每次进去的时候值对吗int iLSY0 = *m_pLsy0;
    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 ))); 

      

  6.   

    也不对,冒出一个QTA.EXE的错误。
    并且我无论是在TRACE还是在for前设断点,就会:
    Unhandle exception in QTA.exe:0x0000005:Access Violation.
      

  7.   

    这样真看不出来  方便的话把程序发我邮箱   [email protected]
      

  8.   

    在OnDraw中加这两句话   你的data中的这两个指针使用前没有赋值,你PIs函数只初始化了view中的两个指针
    if(m_LSMCurve)
    {
    data.m_pLsy0 = m_Plsy0;
    data.m_pXAve = m_xAve;
    data.PaintLSM(pDC);
    }