Визуализация деревьев в VS2008
Я добавлял визуализаторы для некоторых наших типов к autoexp.dat.
Даже с этот блог, от которого все обращаются (даже ребята из Microsoft)! Это была борьба время от времени.
Но я полностью озадачен визуализатором #tree. Во-первых, сообщение в блоге, похоже, полно дыр в его описании (и ни один другой материал, который я смог найти, это адреса, но другие явно его работали). В частности, похоже, есть какие-то магические случаи, когда он знает разыменовать указатель, но я не могу быть уверен, что я изменил свое намерение.
Также существует некоторая двусмысленность между тем, когда вы используете $c и $e. AFAICS они кажутся взаимозаменяемыми - возможно, оба разрешены в качестве помощи для удобочитаемости? Или они действительно означают разные вещи (например, в блоге используется $e, где stl-визуализаторы, которые поставляются с VS2008, используют $c).
Но то, что действительно отсутствует, является объяснением того, как все это сочетается. Я бы предположил, что это будет следовать этому процессу:
- Примените правило "head", чтобы перейти к стартовому node (по указателю)
- Примените правило deref (бит в конце) к разыменованному току node, чтобы получить значение для визуализации.
- Применить левое и правое правило к разыменованному току node, чтобы попасть в левый и правый узлы соответственно (указателем - с нулевым значением в качестве терминатора, если не указано правило пропуска).
- Перейдите к (2), пока не будут посещены все узлы.
Очевидно, есть алгоритм для навигации слева/справа там, где я затушевывался. Это не слишком важно. Что более важно, какие значения учитываются на каждом этапе и когда происходит разыменование.
Это, кажется, единственный процесс, который я могу себе представить, который соответствует примерам, которые я видел. Но мне не удалось заставить его работать с нашей реализацией дерева. Я просто получаю (ошибка), где должны отображаться дети #tree (я получаю один (ошибка) для каждого node, поэтому я предполагаю, что размер записывается правильно). Я пробовал все возможные варианты, о которых я могу подумать, - несколько раз!
Другое, что меня озадачивает, состоит в том, что многие примеры, которые я видел, в том числе связанные с stl, перемещаются из головы в родительский (или похожий) и пропускают голову node. Почему они это делают?
Здесь визуализатор, который я использую (в одной из форм, которые я пробовал - и имена были изменены для защиты... корпоративного):
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.
Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Мы действительно очень нуждаемся в этом! Поэтому я открыл щедрость, но продолжал смотреть на нее сам.
Похоже, я решил это! (для моего случая). Я был довольно близок:
MyTree<*,*,*>{
children(
#(
[raw members]: [$c,!],
#tree
(
head : $c.m_root.m_p,
size : $c.m_size,
left : left,
right : right
) : $e.value
)
)
}
Фокус в том, что в главном правиле нужно полностью указать, как добраться до необработанного указателя в интеллектуальном указателе, но правила слева/справа не выполняются (и не выполняется правило удаления).