A warning - comparison between signed and unsigned integer expressions [-Wsign-compare]的解决方法

本文介绍了在C++中处理signed和unsigned整数比较时出现警告的问题,提供了两种解决方案来避免警告信息的产生,同时解释了警告背后的原因以及解决方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源程序是

/*********************产生观测模型****************************/
void ProRobotics::GenObservations(float sd)
{//Generate observations.假设传感器能观察到机器人周围sd米内的所有特征
    Point2f     delta;                                  //保存机器人位姿和landmarks的位置差值
    float       dst;
    float       theta;                                  //保存特征角,w.r.t robot frame
    observations.clear();
    for(int i = 0; i < landmarks.size(); i++)
    {
        delta = landmarks.at(i) - Point2f(realPathpoints.back().x,realPathpoints.back().y);
        dst   = norm(delta);
        if(dst < sd)
        {
            theta = atan2(delta.y,delta.y) - realPathpoints.back().z;
            dst  += GenGaussianValue(sigma_r*sigma_r);
            theta+= GenGaussianValue(sigma_phi*sigma_phi);
            AngleWrap(theta);
            observations.push_back(Point3f(dst,theta,i));
        }
    }
}

         编译时提示  for(int i = 0; i < landmarks.size(); i++)警告:/home/congleetea/导航/ProRobotics/prorobotics.cpp:303: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]。这个警告目的是防止一个负的符号型的数据转化为无符号型时,会产生一个不是我们想要的很大的数据,并且,大家都知道signed 和unsigned数据的范围也不同。

          这里  for(int  i = 0; i < landmarks.size(); i++)中,i是signed integer,landmarks.size()是unsigned。所以提示了comparison between signed and unsigned integer。解决的办法是:

1)将这一句改为    for(vector<Point2f>::size_type i = 0; i < landmarks.size(); i++)这种方法更精确,Point2f是landmarks的数据类型

size_type是由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型。

2)将这一句改为   for(std::size_t  i = 0; i < landmarks.size(); i++).

size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值