2011-08-11 13 views
1

私は私が把握することができない非常に奇妙なバグを持っています。コンパイラが私のステートメントを並べ替える場合を除いて、私はそれをコードの小さな部分に絞り込んだ。私はそれが真実ではないと信じている。forループの初期化で非常に奇妙なハング

... 
std::cout << "here"<< std::endl; 
std::vector<int>::iterator n_iter; 
std::vector<int>::iterator l_iter; 
std::cout << "here?" << std::endl; 
for(n_iter = n.begin(), std::cout << "not here" ; std::cout << "or here" && n_iter < n.end(); n_iter++) 
{ 
    std::cout << "do i get to the n loop?"; 
    ... 
} 

私はこれを実行すると、私は2番目、「ここで」最初の参照「ここに?」が、私は「ここにいない」または「またはここでは、」出力得ることはありません。そして、私は間違いなく "私はnループに行くのですか?"

奇妙なことは私のプログラムが動作していることです(CPUコア全体をほぼ使用しています...)。しかし、それは終了しません。ちょうどハングします。

私はclang ++とg ++を使ってみましたが、私は最適化を使用していません。私はboost_program_optionsの一部を使用して、ブーストライブラリをインストールしています(とarmadilloと一緒に)。しかし、私は、コンパイラは

それはとか、forループ宣言の内部coutの呼び出しなしで起こり、そしてそれだけでループをスキップしていません...物事の順序を変更する必要があるとは思いません。

ベクトル「n」は、少なくとも1の長さを有し、boost_program_optionsコールによって与えられます。

アイデア?

+0

私はあなたのコードを実行し、予想通り、それは(私は、n個のループ?またはhere'に着く出力 'ないhereor heredoを取得)を実行します。おそらく、ループの内側やコードの最上部にある '...'でやっていることでしょう。 –

+1

私の推測では、それはそれをやっている '...'です。物事をうまく説明するかもしれませんが、出力をフラッシングしないで無限ループに入るので、あなたはそれを見ません。 - このため、デバッグ出力には 'cerr'を使います。 – UncleBens

答えて

3

まず、各文字列の後にstd::endlを出力することをお勧めします。これは、出力用のバッファをフラッシュします。

+0

これはそれだった...ありがとう。 –

2

(あなたはしなかったいくつかの余分な改行を持っている)次のプログラム:

#include <string> 
#include <iostream> 
#include <vector> 

int main() { 
    std::vector<int> n; 
    n.push_back(3); 
    n.push_back(3); 
    n.push_back(3); 

    std::cout << "here"<< std::endl; 
    std::vector<int>::iterator n_iter; 
    std::vector<int>::iterator l_iter; 
    std::cout << "here?" << std::endl; 

    for(n_iter = n.begin(), std::cout << "not here\n" ; std::cout << "or here\n" && n_iter < n.end(); n_iter++) 
    { 
     std::cout << "do i get to the n loop?\n"; 
    } 
} 

は、次のような出力を持っている:

[5:02pm][[email protected] /tmp] make foo 
g++  foo.cc -o foo 
[5:02pm][[email protected] /tmp] ./foo 
here 
here? 
not here 
or here 
do i get to the n loop? 
or here 
do i get to the n loop? 
or here 
do i get to the n loop? 
or here 

これは、あなたが期待するもののように見えるので、私は」あなたが最後に問題を抱えている場所がわからないのですが、スキップされたコードになっている可能性があります。

関連する問題