2012-03-25 15 views
1

私はこのコードを書いているが、ある関数がそれ自身を再帰的に呼び出す。しかし、関数が返すときにwhileループの終わり括弧に戻りませんが、int oがどこに定義されているかを返すように見えるので、無限ループに詰まっています。それだけでしばらく再起動しますので、あなたは、しばらくの内部で任意の値を変更していない無限再帰C++

ErrorCode QuadTree::PartialSearchHelper(Key *key, const uint64_t QInternal, Iterator ** records,int l[], int pow) { 
    try { 
     uint64_t temp=(&indexVec[QInternal])->Firstchild; 
     uint64_t ch = (&indexVec[QInternal])->Firstchild; 
     for (int i = 0; i < pow; i++) { 
      while (!(&indexVec[temp + l[i]])->isLeaf) { 
       int o= l[i]; //it returns here after finishing recursion call!!!!!!!!! 
       PartialSearchHelper(key, temp + l[i], records, l, pow); 
      }       
      ((&indexVec[temp + l[i]]))->findPartial(key, records); 
     } 

    } catch (std::bad_alloc &e) { 
     throw (kErrorOutOfMemory); 
    } catch (ErrorCode &e) { 
     throw (e); 
    } catch (...) { 
     throw (kErrorGenericFailure); 
    } 
    return kOk; 
} 
+5

ある時点で、スタックオーバーフローが発生することがあります。 – 01100110

+0

"しかし、int oがどこに定義されているかに戻ります。"ああ、そうではありません。 –

+1

'indexVec [temp + l [i]]'を実行できるのはなぜですか?(&indexVec [temp + l [i]]) –

答えて

8

は、低レベルのコール

2

に各再帰関数呼び出しは、それが呼び出された場所に正確に戻ります。あなたはwhileループにいるので、明らかに次の繰り返しを続けます。

2

whileループ内にはカウンターがありません。値は変更されません。この時点で

int i = 0; 
while(i<5) 
{ 
    do.Something(); 
} 

は、「i」は常に5未満となりますので、それは停止することはありません:たとえば、のは、非常に基本的な例を見てみましょう。一方、次のように変更した場合:

int i = 0; 
while(i<5) 
{ 
    do.Something(); 
    i=i++ 
} 

i値は、実行するたびに1ずつ増加します。 whileループがforループの内側にある場合、whileループはforループにループバックするために完全に完了する必要があります。 forループ内でforループを使用するか、whileループ内に何らかの種類のカウンタを挿入してみてください。

+1

真剣に、私は私の+ + '?セミコロンがないことは気にしないでください。同じ変数を割り当ててポストインクリメントしたときに何が起こるか考えましたか? – alexis

関連する問題