QT调试时提示Signal name: SIGSEGV - Signal meaning: Segmentation Fault

21 篇文章 0 订阅

          最初我在运行QT时,点击某个功能的按钮时,界面一下就消失了。我找到这个按钮相关的函数,设置断点,分步调试:

在下面这个程序处显示:Signal name: SIGSEGV - Signal meaning: Segmentation Fault。

            谷歌查找之后说是This usually happens when accessing a pointer that was not initialized or was set to 0.

void ProRobotics::MeasurementModel(Mat &delta_z, Point3f obs, Point3f xPred, Mat *Ht, Point2f *estLm)
{//delta_z用来存储对landmarks的真是观测和预测的差值向量
    float   dst,theta;                              //用来存储范数,就是两点之间的距离
    Point2f z, zp;                                  //用来存储真实观测值(与后者差值)和预测的观测值
    Point2f delta;                                  //用来存储landmarks与预测的机器人位姿的差值向量]
    if(!estLm)//如果Landmark的估计值是空,则调用者非SLAM
    {//将estLm指定为Landmark的真实值
        estLm = landmarks.at(obs.z);
    }
......

        调试到if语句时出现错误了,修改为:estLm = reinterpret_cast<Point2f*>(&(landmarks.at(obs.z)));

运行就成功了。

        出现这个原因的地方会很多,但是原因都差不多是访问不存在或者不正确的地方造成的。

下面这个程序是我再一次遇到这种错误的程序。当这里的double是float时有时候也会出现这种错误。

       

  //计算Vt(3*2)   at<float>时会出现segfault的错误。
        Vt.at<double>(0,0)=(sin(xLast.z+Wd*T)-sin(xLast.z))/Wd; Vt.at<double>(0,1)=Vd*(sin(xLast.z)-sin(xLast.z+Wd*T))/Wd/Wd+Vd*cos(xLast.z+Wd*T)*T/Wd;
        Vt.at<double>(1,0)=(cos(xLast.z)-cos(xLast.z+Wd*T))/Wd;  Vt.at<double>(1,1)=-Vd*(cos(xLast.z)-cos(xLast.z+Wd*T))/Wd/Wd+Vd*sin(xLast.z+Wd*T)*T/Wd;
        Vt.at<double>(2,0)=0;                          	        Vt.at<double>(2,1)=T;


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值