在VS2008中可视化树

时间:2012-07-07 17:40:29

标签: c++ visual-studio-2008 tree visualization

我一直在为autoexp.dat添加一些类型的可视化工具。 即使是that blog that everyone refers back(即使是微软的家伙!),有时也是一场斗争。

但我完全被#tree可视化工具所困扰。首先,博客文章似乎在其描述中充满了漏洞(没有其他材料我能够找到地址 - 但其他人已经清楚地了解它)。特别是似乎有一些神奇的案例,它知道取消引用一个指针 - 但我无法确定我是否反过来设计了意图。 当你使用$ c和$ e时,似乎也存在一些歧义。 AFAICS它们似乎是可以互换的 - 也许两者都可以作为可读性的辅助手段?或者它们真的意味着不同的东西(例如,博客使用$ e,其中VS2008附带的stl可视化器使用$ c)。

但真正缺少的是解释它们如何融合在一起。我原以为它会遵循这个过程:

  1. 应用“head”规则到达起始节点(通过指针)
  2. 将deref规则(末尾的位)应用于解除引用的当前节点,以获取可视化的值。
  3. 将左右规则应用于解除引用的当前节点,分别到达左右节点(通过指针 - 以null作为终止符,除非指定了跳过规则)。 / LI>
  4. 转到(2),直到访问完所有节点。
  5. 显然有一个我左右导航的算法,我已经掩饰了。那不是太重要。更重要的是在每个阶段和解除引用时都要考虑哪些值。

    这似乎是我能想到的唯一适合我见过的例子的过程。但我一直无法使用我们的树实现。我只是得到(错误)应该显示#tree子项(我为每个节点得到一个(错误),所以我假设正确捕获了大小)。我已经尝试了可以​​想到的变化 - 最多次!

    让我感到困惑的另一件事是,我见过的许多例子,包括捆绑的stl,从头到父(或类似)导航,并跳过头节点。为什么他们这样做?

    这是我正在使用的可视化工具(我尝试过的其中一种形式 - 名称已更改为保护......公司):

    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&lt;&gt;是一个智能指针,将原始指针保存在m_p中。

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

我们开始真的需要这个!所以我开了一个赏金,但继续自己看着它。

看起来我已经解决了! (对我来说)。我其实非常接近:

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

诀窍是头规则需要完全指定如何到达智能指针内的原始指针,但左/右规则不能(并且de-ref规则也没有)。