12

一部の型のビジュアライザーを autoexp.dat に追加しています。誰もが参照しているブログ(Microsoft の人たちも!) でさえ、苦労することもありました。

しかし、#tree ビジュアライザーには完全に困惑しています。まず、そのブログ投稿は、その説明に穴がたくさんあるようです (そして、私がアドレスを見つけることができた他の資料はありませんが、他の人は明らかにそれを機能させています)。特に、ポインターを逆参照することを知っている魔法のようなケースがいくつかあるようですが、意図をリバースエンジニアリングしたかどうかはわかりません。また、$c と $e を使用する場合にはあいまいな点があるようです。AFAICS それらは互換性があるように見えます-おそらく両方とも読みやすさの補助として許可されていますか? それとも、それらは本当に異なることを意味しますか (たとえば、そのブログでは、VS2008 に付属の stl ビジュアライザーが $c を使用する場合に $e を使用します)。

しかし、実際に欠けているのは、すべてがどのように組み合わされるかについての説明です。私はそれが次のプロセスに従うと想像していたでしょう:

  1. 「head」ルールを適用して開始ノードに到達します (ポインターによって)
  2. deref ルール (末尾のビット) を参照解除された現在のノードに適用して視覚化するための値を取得します。
  3. 左と右のルールを逆参照された現在のノードに適用して、それぞれ左と右のノードに到達します (スキップ ルールが指定されていない限り、ポインタによって - ターミネータとして null を使用)。
  4. すべてのノードが訪問されるまで (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 に生のポインターを保持します。

どんな助けでも大歓迎です。

4

1 に答える 1

5

私たちは本当にこれが必要になり始めました!それで私はバウンティを開きましたが、自分でそれを見続けました.

解決したみたい!(私の場合)。私は実際にはかなり近かった:

MyTree<*,*,*>{
    children(
        #(
            [raw members]: [$c,!],
            #tree
            (
                head : $c.m_root.m_p,
                size : $c.m_size,
                left : left,
                right : right
            ) : $e.value
        )
    )
}

秘訣は、スマート ポインター内の生のポインターに到達する方法を head ルールで完全に指定する必要があるが、left/right ルールでは指定しない (de-ref ルールも指定しない) ことです。

于 2012-12-05T18:29:34.430 に答える