一部の型のビジュアライザーを autoexp.dat に追加しています。誰もが参照しているブログ(Microsoft の人たちも!) でさえ、苦労することもありました。
しかし、#tree ビジュアライザーには完全に困惑しています。まず、そのブログ投稿は、その説明に穴がたくさんあるようです (そして、私がアドレスを見つけることができた他の資料はありませんが、他の人は明らかにそれを機能させています)。特に、ポインターを逆参照することを知っている魔法のようなケースがいくつかあるようですが、意図をリバースエンジニアリングしたかどうかはわかりません。また、$c と $e を使用する場合にはあいまいな点があるようです。AFAICS それらは互換性があるように見えます-おそらく両方とも読みやすさの補助として許可されていますか? それとも、それらは本当に異なることを意味しますか (たとえば、そのブログでは、VS2008 に付属の stl ビジュアライザーが $c を使用する場合に $e を使用します)。
しかし、実際に欠けているのは、すべてがどのように組み合わされるかについての説明です。私はそれが次のプロセスに従うと想像していたでしょう:
- 「head」ルールを適用して開始ノードに到達します (ポインターによって)
- deref ルール (末尾のビット) を参照解除された現在のノードに適用して、視覚化するための値を取得します。
- 左と右のルールを逆参照された現在のノードに適用して、それぞれ左と右のノードに到達します (スキップ ルールが指定されていない限り、ポインタによって - ターミネータとして null を使用)。
- すべてのノードが訪問されるまで (2) に進みます。
明らかに、私が見落としている左/右をナビゲートするためのアルゴリズムがあります。それはあまり重要ではありません。さらに重要なことは、各段階で考慮される値と、逆参照が発生するタイミングです。
これは、私が見た例に適合する、私が想像できる唯一のプロセスのようです。しかし、ツリーの実装で動作させることができませんでした。#tree の子を表示する場所 (エラー) を取得するだけです (ノードごとに 1 つの (エラー) を取得するため、サイズが正しくキャプチャされていると思います)。私は考えられる限りの可能なバリエーションを試しました-ほとんど数回!
私を困惑させるもう1つのことは、バンドルされたstlのものを含む、私が見た多くの例が、頭から親(または同様のもの)に移動し、頭のノードをスキップすることです。なぜ彼らはそうするのですか?
これが私が使用しているビジュアライザーです(私が試したフォームの1つで、名前は...企業を保護するように変更されています):
MyTree<*,*,*>{
children(
#(
[raw members]: [$c,!],
#tree
(
head : $c.m_root.m_p,
size : $c.m_size,
left : left.m_p,
right : right.m_p
) : $e.value
)
)
}
そして、これが私のツリークラスの疑似コードです。
MyTree:
Ptr<Note> m_root
int m_size
Node:
ValueT value
Ptr<Node> left
Ptr<Node> right
... ここで、Ptr<> はスマート ポインターであり、m_p に生のポインターを保持します。
どんな助けでも大歓迎です。