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

源程序是

/*********************产生观测模型****************************/
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。

你可能感兴趣的:(C++,c,存储,unsigned,and,comparison,signed)