私は、AVLツリーとランクツリーを含む割り当てを持っています。 この特定の割り当てでは、ノードに別の情報を保持するランクAVLツリーを実装する必要があります。
私はこの問題を抱えています:
私はAVLツリーを作って、ランクツリーのために私は継承を使いました。
ランクツリーの「挿入」機能では、ノードを引数として受け取る「setAllHeights」という別の関数を呼び出します。
しかし、引数のデバッガの値を見ると、関数がNULLポインタを受け取ることがわかります。
なぜ私は "setAllHeights"関数を入力する前に引数の値をチェックしたのか、なぜならNULLでないことが分かりません。
問題は何か、それはどうして起こるのですか?
私はあなたの助けに感謝します。C++ポインタは、関数呼び出し後に継承の値を失います。
関数insertのコード:
template<class T, class Compare>
bool RAVL<T, Compare>::insert(const T& data) {
if (root == NULL) {
root = new (nothrow) RNode<T, Compare>(data, NULL);
if (!root)
throw AllocationError();
size++;
return true;
}
Compare cmp;
RNode<T, Compare> *v;
if (find(data, &v))
return false;
if (cmp(v->data, data)) {
v->right = new (nothrow) RNode<T, Compare>(data, v);
if (!v->right)
throw AllocationError();
} else {
v->left = new (nothrow) RNode<T, Compare>(data, v);
if (!v->left)
throw AllocationError();
}
Node<T,Compare> * n=v;
AVL<T,Compare>::setAllHeights(n);
rebalance(v);
size++;
return true;
}
setAllHeights関数のコード:
template<class T, class Compare>
void AVL<T, Compare>::setAllHeights(Node<T, Compare> *n) {
if (n == NULL) {
return;
}
setHeight(n);
setAllHeights(n->parent);
}
このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –
これはまさに私がやったことです。私はデバッガで関数がNULLポインタを受け取ることがわかりました。なぜそれが起こっているのか分かりません。 – kidneyThief
デバッグビルドを行っていますか?時には最適化されたビルドのような奇妙なことを見ることができます。 –