2016-12-05 14 views
1

私は、クォードツリーを通して実行され、各ノードに対してキーを生成する再帰関数を持っています。しかし、これは変数myKeymyKey1として保存した場合にのみ機能します。私がそれをしなければ、その結果の鍵は間違っています。しかし、なぜ?それは私には分かりません。ここでパラメータを保存せずに再帰関数が機能しない

は関数である。

void keygen(tree *tn, long unsigned int myKey) 
{ 
    long unsigned int myKey1 = myKey; // Why do I need this line? 

    for(int q=0; q<4; q++){ 
     // 1) Check if child exists 
     if(tn->child[q] != NULL){ 
      // Make key 
      myKey1 = (myKey<<DIM)|q; 
      // Save key 
      tn->child[q]->key = myKey1; 
      // Call again if leaf    
      if(tn -> child[q] -> isLeaf == 0){ 
       keygen(tn->child[q], myKey1); 
      } 
     } 
    } 
} 
+5

'myKey1 =(myKey << DIM)| q;'行のために?もともとmyKeyを左右に使用していた場合は、ループの繰り返しごとにシフトが累積されます。 – happydave

+1

@happydave:これを答えにしてみませんか? – alk

+0

@happydaveはい、今は見ます。あなたはまったく正しい!ありがとうございました! – Samuel

答えて

2

この行は、おそらく問題

myKey1 = (myKey<<DIM)|q; 

であるあなたは、あなたがすべての上DIMに​​よってシフトすることがあります、別のmyKey1変数を作成していない場合4回目の反復では、4 * DIM(シフト間のさまざまな値のqとのビット単位OR)にシフトします。

オリジナルのmyKeyを変更するのではなく、新しい変数を作成することで、元のキーにシフトする、または一度関連させることが目的のようです。

関連する問題