2012-03-20 15 views
0

これは初心者のような感じですが、わかりません。私はstd :: vectorの項目を繰り返し処理したい。現在、私はこのループを使用します。ループが原因でシステムエラーが発生する

for (unsigned int i = 0; i < buffer.size(); i++) { 
    myclass* var = buffer.at(i); 
    [...] 
} 

はしかし、私は実際には逆の順序でそれを反復処理したいことを実現:最後に始まり、0に自分の道を働いだから私はこのイテレータを使用してみました:

for (unsigned int i = buffer.size()-1; i >= 0; i--) { 
    myclass* var = buffer.at(i); 
    [...] 
} 

しかし、単に古い行を新しい(そしてもちろん再コンパイルした)行に置き換えるだけで、適切に実行されてコードを繰り返し実行するので、プログラムはこの行に最初に衝突したときにプログラムをクラッシュさせ、このエラーは

http://i43.tinypic.com/20sinlw.png

"[プログラム]が動作を停止しました"ダイアログボックスの後に続きます。

また、Code:Blocksに従って、プログラムは終了コード3を返します(this articleと思われる場合)。ERROR_PATH_NOT_FOUND:指定されたファイルが見つかりません。

アドバイスはありますか?私のforループに何か不足していると思いますか?多分何らかのメモリ問題を引き起こしていますか? 3のリターンコード、または記事は誤解を招くものであり、実際には「パスが見つかりません」という意味ではありませんか?

+0

まず、デバッガで実行してみましたか?クラッシュの正確な位置を特定するのに役立ちます。また、何が起こっているのかも知るために変数を調べることができます。第2に、第2のループでは、サイズがゼロよりも大きいか? –

+0

'unsigned int'インデックスで-1にアクセスするには? '2 ** 32-1'のようにもっとアクセスしています。 – Kaz

+1

リラックスしてイテレータを使用してください... –

答えて

2

場合i == 0(すなわち、何が最後の反復であるべきである)、unsigned intの最大可能値にラップアラウンドするiを引き起こすi--減少。したがって、ループを停止したい場合でも、条件i >= 0が保持されます。 std::vectorが定義されrbeginrendメソッドを持っているので、あなたはイテレータを使用することができ、あるいは、

unsigned int i; 
unsigned int size = buffer.size(); 
for (unsigned int j = 0; j < size; j++) { 
    i = size - j - 1; 

は、この問題を解決するには、元のループロジックを維持し、このような何かを、してみてください、しかし、デクリメントiを生み出すことができます:

for(typename std::vector<myclass *>::reverse_iterator i = buffer.rbegin(); i != rend(); ++i) 
{ 
    myclass* var = *i; 
    // ... 
} 

(小さな構文エラーがあるかもしれません - 私は便利なコンパイラを持っていない)

3

符号なし整数は、常に0より大きくなります。さらに、0から大きな値に減少します。

+0

もちろん。どのように私はそれをお見逃しですか?だから、問題は単なるスタックのオーバーフローですか?それはちょうどループ広告無限を通過している...いいえ待ってください。それは約40億回のバッファリングをしています(符号なし整数なので)buffer.at(MAX_INT_VALUE * 2)はメモリエラーを引き起こしています...だから、あなたは終わりの状態のために何を提案しますか? –

+3

@drummerp 'buffer'が標準のコンテナであれば、代わりに' rbegin'と 'rend'を使った逆方向反復子を使うことができます。 –

+0

@drummerpは、int iまたはlong iを使用します。 – Pepe

0
#include <vector> 

using namespace std; 

int main() { 
    vector<int> buffer = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    for (vector<int>::reverse_iterator it = buffer.rbegin(); it != buffer.rend(); it++) { 
     //do your stuff 
    } 
    return 0; 
}