我有一个递归函数,它在四叉树中运行,为每个节点生成一个键。但这只在我将变量myKey保存为myKey1时有效。如果我不这样做,结果键是错误的。但为什么呢?我不清楚。
功能如下:

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);
            }
        }
    }
}

最佳答案

这条线可能是问题所在

myKey1 = (myKey<<DIM)|q;

如果不生成单独的myKey1变量,那么在循环的每次迭代中都将按DIM进行移位,因此到第四次迭代时,将按4*DIM进行移位(并在移位之间按不同的q值进行位运算)。
似乎您的目的只是相对于原始键进行移位或一次移位,这是通过创建新变量而不是就地修改原始myKey来实现的。

09-27 07:08