-
21-08-2019 - |
質問
私はこの(C ++または多分C)コードを持っていると仮定
vector<int> my_vector;
for (int i = 0; i < my_vector.size(); i++) {
my_vector[i] = 0;
}
それが適切に行われます場合は、私は気にしないでください。重要な部分は、forループ宣言です。
コンパイラは、()大きさは、このための署名/符号なしの不一致を与えるunsigned int型ではなく、署名したものを返します。それは符号なしにi
を変更する方法重要ですか?私は習慣のうちint型としてループカウンタを宣言しますが、これは潜在的なエラーである場合、私は習慣から抜け出すために自分自身を強制します。
解決
私はそれが非常に重要だと言うでしょう。あなたのコードでは、このような問題を残す場合は、警告を無視し、あるいはこのような偽陽性は実際の問題を示す警告をかき消すせるのが習慣に取得するのは簡単です。
この場合、この特定のエラーのために、それはおそらく大したことではないのです - 無署名が負の符号付きの値にラップしまう前に、32ビットプラットフォーム上で、あなたは、ベクターで20億以上のエントリを持つ必要があるだろう。それは署名/符号なしの不一致が問題となる状態に入るために、おそらくことはできませんので、取得するには、このようなベクトルは、あなたのすべてのメモリを使い果たすでしょう。
他のヒント
技術的には、i
はvector<int>::size_type
でなければなりません。あなたは、あなたのコード内でtypedef
sを使用しての習慣に取得する必要があります:
typedef vector<int> VectorType;
VectorType my_vector;
for (VectorType::size_type i = 0; i < my_vector.size(); i++) {
my_vector[i] = 0;
}
我々はdeque
に変更した場合、さて、私たちは、1つの行を変更します。それは奇抜なsize_typeを持っているいくつかのカスタムコンテナの場合でも、あなたはすべてがOKになると暖かく、ファジー感覚を得ます。そして、それは多くの価値があります。でも署名/だけ符号なしで、必然的にあなたを噛まないように戻ってくる署名/署名のない変換を使用して、いくつかのトリッキーなプロモーションの問題があります。
これは、ベクトルの大きさがINT_MAX
を超え万一に重要である可能性があります。ベクトルの大きさが署名int
で表現できる最大値よりも大きい場合には、お使いのループが終了することはありません。
さて、その重要な兆候を持っているdoesntのいる、)符号付き整数は符号を持っているので、私は負の値になってすべての道を行くことができる、それがどのように大きな関係なく、それはまだ(サイズより小さくなりますので。
11111111 <10000000
あなたの例のほとんどのケースでは、それは問題ではありません。しかし、あなたのプログラムが動作しない場合、あなたが(または必要があります)まず最初に警告がないことを確認することですので、それは取って価値がないチャンスです。
できるだけ少ない警告があることを確認します。
は、ベクトル:: size_typeを使用します。またはあなたのベクトルをループするイテレータを使用しています。 エラーとして独自の警告のすべてを処理することを確認します。