2012-07-07 14 views
12

Dodałem wizualizatory niektórych typów do pliku autoexp.dat. Nawet z that blog that everyone refers back (nawet dla użytkowników Microsoftu!) To była walka.Wizualizacja drzew w VS2008

Ale jestem całkowicie zaskoczony przez #tree wizualizator. Po pierwsze, ten wpis na blogu wydaje się być pełen dziur w opisie (i nie ma żadnego innego materiału, który byłby w stanie znaleźć adresy, ale inni wyraźnie to zrozumieli). W szczególności wydaje się, że istnieją pewne magiczne przypadki, w których wie, że dereferencja jest wskaźnikiem - ale nie mogę być pewna, czy udało mi się odwrócić tę intencję. Również wydaje się, że istnieje pewna niejednoznaczność, gdy używasz $ c i $ e. AFAICS wydają się być wymienne - może oba są dozwolone jako pomoc w czytelności? Czy naprawdę mają na myśli różne rzeczy (ten blog na przykład używa $ e, gdzie wizualizatory STL dołączone do VS2008 używają $ c).

Ale to, czego naprawdę brakuje, to wyjaśnienie, jak to wszystko razem pasuje. Chciałbym sobie wyobrazić byłoby śledzić ten proces:

  1. zastosować regułę „głowa”, aby dostać się do węzła początkowego (poprzez wskaźnik)
  2. Zastosuj regułę deref (wiertło na końcu) do dereferencjonowane bieżący węzeł, aby uzyskać wartość do wizualizacji.
  3. Zastosuj reguły lewą i prawą do węzła bieżącego dereferencji, aby uzyskać odpowiednio lewy i prawy węzeł (za pomocą wskaźnika - z wartością zerową jako terminatorem, chyba że określono regułę pominięcia).
  4. Przejdź do (2), dopóki wszystkie odwiedzone węzły nie zostaną odwiedzone.

Oczywiście istnieje algorytm do poruszania się w lewo/prawo tam, nad którym pomalowałem. To nie jest zbyt ważne. Ważniejsze jest to, które wartości są brane pod uwagę na każdym etapie i kiedy dochodzi do dereferencji.

To wydaje się być jedynym procesem jaki mogę sobie wyobrazić, który pasuje do przykładów, które widziałem. Ale nie byłem w stanie zmusić go do pracy z implementacją naszego drzewa. Właśnie dostaję (błąd), gdzie powinny być wyświetlane #tree dzieci (dostaję jeden (błąd) dla każdego węzła, więc zakładam, że rozmiar jest przechwytywany poprawnie). Próbowałem jakiejkolwiek możliwej odmiany, o której mogę pomyśleć - większość kilka razy!

Inną rzeczą, która mnie zastanawia, jest to, że wiele przykładów, które widziałem, łącznie z dołączonymi pakietami, przechodzi z głowy na rodzica (lub podobnego) i pomija węzeł główny. Dlaczego to robią?

Oto wizualizer używam (w jednej z form próbowałem - i nazwiska zostały zmienione, aby chronił ... korporacyjna):

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

A oto niektóre pseudo-code dla moich klas drzewa:

MyTree: 
    Ptr<Note> m_root 
    int m_size 

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

... gdzie Ptr <> to inteligentne wskaźnik, przytrzymując surowy wskaźnik w m_p.

Każda pomoc zostanie bardzo doceniona.

+0

Niektóre z nich mogą działać tylko w przypadku projektów MS, dla których zostały przetestowane. Podobnie jak te z węzłem wartowniczym (które można pominąć). Miałem podobne problemy, próbując zmieścić się w projekcie listy linków odbiegających od oryginału. Bez powodzenia. –

+0

Nie mam węzła wartownika - więc powinno być * łatwiejsze *, pomyślałem. Mój wygląd bardziej przypomina wirtualny przykład pod wieloma względami - największą różnicą jest moje użycie inteligentnych wskaźników. – philsquared

Odpowiedz

5

Naprawdę potrzebowaliśmy potrzebujących tego! Więc otworzyłem nagrodę, ale kontynuowałem to oglądając.

Wygląda, że ​​go rozwiązałem! (w moim przypadku).I był rzeczywiście dość blisko:

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

Sztuką jest to, że reguła głowa musi w pełni określić, w jaki sposób dostać się do surowego wskaźnik w inteligentny wskaźnik ale lewy/prawy reguły nie robić (i nie robi de- reguła ref.).