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:
- zastosować regułę „głowa”, aby dostać się do węzła początkowego (poprzez wskaźnik)
- Zastosuj regułę deref (wiertło na końcu) do dereferencjonowane bieżący węzeł, aby uzyskać wartość do wizualizacji.
- 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).
- 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.
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. –
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