我一直在为autoexp.dat添加一些类型的可视化工具。 即使是that blog that everyone refers back(即使是微软的家伙!),有时也是一场斗争。
但我完全被#tree可视化工具所困扰。首先,博客文章似乎在其描述中充满了漏洞(没有其他材料我能够找到地址 - 但其他人已经清楚地了解它)。特别是似乎有一些神奇的案例,它知道取消引用一个指针 - 但我无法确定我是否反过来设计了意图。 当你使用$ c和$ e时,似乎也存在一些歧义。 AFAICS它们似乎是可以互换的 - 也许两者都可以作为可读性的辅助手段?或者它们真的意味着不同的东西(例如,博客使用$ e,其中VS2008附带的stl可视化器使用$ c)。
但真正缺少的是解释它们如何融合在一起。我原以为它会遵循这个过程:
显然有一个我左右导航的算法,我已经掩饰了。那不是太重要。更重要的是在每个阶段和解除引用时都要考虑哪些值。
这似乎是我能想到的唯一适合我见过的例子的过程。但我一直无法使用我们的树实现。我只是得到(错误)应该显示#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中。
非常感谢任何帮助。
答案 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规则也没有)。