2012-07-07 16 views
12

Bazı türler için autoexp.dat'a görselleştiriciler ekliyorum. Hatta that blog that everyone refers back ile (hatta microsoft beyler!) Zaman zaman bir mücadele oldu.VS2008'de ağaçları görüntüleme

Ama tamamen #tree görselleştiricisi tarafından stumped kulüpler. Öncelikle bu blog yazısı onun açıklamasında delikleriyle dolu gibi görünüyor (ve başka hiçbir malzeme adresleri bulamadım - ama diğerleri açıkça işe koydu). Özellikle, bir işaretçiyi işaret edemediği bazı büyülü durumlar var gibi görünüyor - ama niyetini tersine çevirdiğime emin olamıyorum. Ayrıca, $ c ve $ e kullandığınızda bazı belirsizlikler var gibi görünüyor. AFAICS birbirleriyle değiştirilebilir gibi görünüyorlar - belki de her ikisine de okunabilirliğe bir yardım olarak izin verilir? Ya da gerçekten farklı şeyler kastediyorlar (bu blog, örneğin, VS2008 ile gelen stl görüntüleyicilerinin $ c'yi kullandığı $ e'yi kullanır).

Ama gerçekten eksik olduğunu Tümünün birlikte nasıl bir açıklama yer almaktadır.

  1. indirgenmedikleri için DEREF kuralı (sonunda bit) uygulayın (pointer ile) başlangıç ​​düğümüne almak için "kafa" kuralı uygula: Ben bu süreci takip edecek hayal olurdu Geçerli düğüm görselleştirme için değer elde etmek için.
  2. Sol ve sağ düğümlere sırasıyla sol ve sağdaki düğümlere ulaşmak için sol ve sağ kuralları dereferanslı geçerli düğüme uygulayın (bir atlama kuralı belirtilmemişse, bir sonlandırıcı olarak null ile).
  3. Tüm düğümler ziyaret edilene kadar (2) seçeneğine gidin.

Açıkça göründüğüm solda/sağda gezinmek için bir algoritma var. Bu çok önemli değil. Daha da önemlisi, her aşamada hangi değerlerin dikkate alındığı ve başarısızlığın gerçekleştiği zaman. Bunu hayal tek süreç olarak görünüyor

gördüğüm örnekler uyuyor. Ama bunu ağaç uygulamalarımızla çalışmaya başaramadım. Ben sadece #tree çocukların görüntülenmesi gereken yerde (hata) alıyorum (her düğüm için bir (hata) alıyorum, bu yüzden boyutun doğru şekilde yakalandığını farz ediyorum). Düşünebildiğim olası varyasyonları denedim - çoğu kez!

Kafamı kurcalayan başka bir şey paketlenmiş stl olanlar dahil gördüğüm birçok örnek, ebeveyn (veya benzeri) tırnağa gidin ve kafa düğümü atlamak olmasıdır. Bunu neden yapıyorlar? İşte

kullanıyorum Visualiser var (ben denedim formları birinde - ve isimler korumalı ... kurumsal olarak değiştirildi):

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 
     ) 
    ) 
} 

Ve burada bazı sözde kod benim ağaç sınıfları için: Ptr <> m_p ham işaretçi tutan, akıllı işaretçi olan

MyTree: 
    Ptr<Note> m_root 
    int m_size 

Node: 
    ValueT value 
    Ptr<Node> left 
    Ptr<Node> right 

....

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

+0

Bunlardan bazıları, yalnızca test edildikleri MS tasarımları için işe yarayabilir. Bir sentinel düğümlü olanlar gibi (atlayabilirler). Orijinalden ayrılan bağlantılı bir liste tasarımına uymaya çalışırken benzer problemlerim vardı. Bununla hiç şans yok. –

+0

Bir sentinel düğümüm yok - bu yüzden * daha kolay olmalı *, düşünürdüm. Benimki çoğu açıdan sanaldub örneğine benziyor - en büyük fark benim akıllı göstergeler kullanmamdır. – philsquared

cevap

5

Biz bu ihtiyacı gerçektenbaşladı! Bu yüzden bir ödül açtım ama ona bakmaya devam ettim.

Çözdüğüm gibi görünüyor! (Benim durumum için).Ben oldukça yakın aslında:

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

hile kafa kuralı tamamen (akıllı pointer içinde ham pointer olsun ama sol/sağ kurallar değildir nasıl yapılacağını belirtmek gerekiyor ve ne de- yapmasıdır ref kuralı).