【发布时间】:2012-07-07 19:13:33
【问题描述】:
我一直在为我们的一些类型添加可视化工具到 autoexp.dat。 即使有that blog that everyone refers back (甚至是微软的人!),有时也很困难。
但我完全被#tree 可视化工具难住了。首先,该博客文章的描述似乎充满了漏洞(而且我找不到其他材料可以找到地址-但其他人显然已经使它起作用了)。特别是似乎有一些神奇的情况,它知道取消引用指针 - 但我不能确定我已经逆向工程了意图。 使用 $c 和 $e 之间似乎也存在一些歧义。 AFAICS 它们似乎是可以互换的——也许两者都被允许作为可读性的帮助?或者它们真的意味着不同的东西(例如,那个博客使用 $e,而 VS2008 附带的 stl 可视化工具使用 $c)。
但真正缺少的是对它们如何组合在一起的解释。我会想象它会遵循这个过程:
- 应用“head”规则到达起始节点(通过指针)
- 将 deref 规则(末尾的位)应用于 dereferenced 当前节点以获得可视化值。
- 将左右规则应用于取消引用的当前节点以分别到达左右节点(通过指针 - 以 null 作为终止符,除非指定了跳过规则)。
- 转到 (2),直到访问完所有节点。
显然,我已经忽略了一种用于向左/向右导航的算法。这不是太重要。更重要的是在每个阶段考虑哪些值以及取消引用发生的时间。
这似乎是我能想象到的唯一符合我所见示例的过程。但我一直无法让它与我们的树实现一起工作。我只是得到(错误)应该显示#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 是一个智能指针,将原始指针保存在 m_p 中。
任何帮助将不胜感激。
【问题讨论】:
-
其中一些可能仅适用于它们所测试的 MS 设计。就像那些有哨兵节点的节点(他们可以跳过)。我在尝试适应偏离原始的链表设计时遇到了类似的问题。没有运气。
-
我没有哨兵节点 - 所以它应该更容易,我想。我的在大多数方面看起来更像 virtualdub 示例 - 最大的不同是我使用智能指针。
标签: c++ visual-studio-2008 tree visualization