1. ホーム
  2. C++

警告 - 符号付き整数式と符号なし整数式の比較 [-Wsign-compare] 解決方法

2022-02-10 18:36:23

<スパン ソースプログラムは

/********************* generates the observation model ****************************/
void ProRobotics::GenObservations(float sd)
{/Generate observations. Assume that the sensor can observe all features within sd meters of the robot
    Point2f delta; //Save the difference between the robot's pose and the position of the landmarks
    float dst;
    float theta; //save feature angles, 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++) warning: /home/congleetea/nav/ProRobotics/prorobotics.cpp:303: warning: signed and unsigned integer expression [-Wsign-compare] の比較です。この警告の目的は、負の符号付きデータが符号なしに変換され、思うようにデータが大きくならないことを防ぐためで、ご存知のように符号付きデータと符号なしデータは範囲が異なります。

          ここで for(int i = 0; i < landmarks.size(); i++), i は符号付き整数で landmarks.size() は符号なし整数なので、符号付き整数と符号なし整数の比較を促しています。解決策は

<スパン 1) この文章を for(vector<Point2f>::size_type i = 0; i < landmarks.size(); i++) に変更する この方法はより正確である。 Point2f はランドマークのデータ型です。 .

size_typeはstringクラス型とvectorクラス型で定義された、任意の文字列オブジェクトやvectorオブジェクトの長さを保持する型であり、標準ライブラリの型ではsize_typeは符号なし型として定義されています。

2)この文章を for(std::size_t i = 0; i < landmarks.size(); i++) に置き換える。

size_t型は、C言語標準ライブラリのヘッダファイルであるcstddefで定義されています stddef.h この型のC++版。機械依存の符号なし型であり、メモリに格納されるオブジェクトの大きさを保証するのに十分な大きさである。添え字のある要素にアクセスする場合、ベクターはvector:を使用します。 size_type を添え字の型として使用し、一方 配列 の添え字は、正しい型であるsize_tです。