2012-07-07 49 views
12

我一直在爲autoexp.dat添加一些可視化器。 即使有that blog that everyone refers back(甚至微軟的人!),這有時是一個鬥爭。在VS2008中可視化樹木

但是我完全被#tree可視化器難住了。首先,博客文章似乎在其描述中充滿了漏洞(並且沒有其他材料能夠找到地址 - 但其他人明確知道它的工作原理)。特別是,似乎有一些神奇的情況下,它知道取消引用一個指針 - 但我不能確定我已經扭轉了這個意圖。 當你使用$ c和$ e時,似乎也有一些含糊之處。 AFAICS它們似乎是可以互換的 - 可能兩者都可以作爲可讀性的輔助手段?或者他們真的意味着不同的東西(例如,博客使用$ e,VS2008附帶的stl可視化工具使用$ c)。

但真正缺失的是如何將它們融合在一起的解釋。我會想到它會遵循這個過程:

  1. 應用「頭」的規則去的開始節點(通過指針)
  2. 應用DEREF規則(在末尾位)來取消引用的當前節點獲取可視化的值。
  3. 將左右規則應用於取消引用的當前節點以分別到達左側和右側節點(通過指針 - 以null作爲終止符,除非指定跳過規則)。
  4. 轉到(2),直到所有節點都被訪問過。

顯然有一個算法左右導航,我已經掩蓋了。這並不重要。更重要的是在每個階段以及何時解除引用時考慮哪些值。

這似乎是我可以想象的唯一一個適合我見過的例子的過程。但是我一直無法讓它與我們的樹實現一起工作。我只是得到(錯誤)應顯示#tree子項的位置(每個節點我都得到一個(錯誤),所以我認爲正確捕獲了大小)。我嘗試過任何可能的變化,我可以想到 - 最多次!

另一件讓我感到困惑的事情是,我見過的很多例子,包括捆綁的stl,從頭到尾(或類似)導航,並跳過頭節點。他們爲什麼這樣做?

下面是我使用Visualiser的(在我試過的形式之一 - 和名稱已更改爲保護...企業):

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原始指針。

任何幫助將不勝感激。

+0

其中的一些可能只適用於他們進行測試的MS設計。就像那些有哨兵節點的人一樣(他們可以跳過)。我有類似的問題試圖適應鏈接列表設計偏離原來的。沒有那個運氣。 – 2012-07-07 17:52:01

+0

我沒有哨兵節點 - 所以它應該*更容易*,我會想。在大多數方面,我看起來更像virtualdub示例 - 最大的區別是我使用智能指針。 – philsquared 2012-07-07 18:01:55

回答

5

真的開始真的需要這個!所以我開了一個賞金,但繼續自己看。

看起來像我解決了它! (爲我的情況)。我其實很接近:

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

訣竅是頭部規則需要充分說明如何獲得原始指針智能指針內,但左/右規則沒有(而且也不在去參考規則)。