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

来源:互联网 发布:查看oracle数据块大小 编辑:程序博客网 时间:2024/05/16 10:41

源程序是

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

1 0
原创粉丝点击