質問

私はこの(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億以上のエントリを持つ必要があるだろう。それは署名/符号なしの不一致が問題となる状態に入るために、おそらくことはできませんので、取得するには、このようなベクトルは、あなたのすべてのメモリを使い果たすでしょう。

他のヒント

技術的には、ivector<int>::size_typeでなければなりません。あなたは、あなたのコード内でtypedefsを使用しての習慣に取得する必要があります:

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を使用します。またはあなたのベクトルをループするイテレータを使用しています。 エラーとして独自の警告のすべてを処理することを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top