Подтвердить что ты не робот

Визуализация деревьев в 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.

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Мы действительно очень нуждаемся в этом! Поэтому я открыл щедрость, но продолжал смотреть на нее сам.

Похоже, я решил это! (для моего случая). Я был довольно близок:

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

Фокус в том, что в главном правиле нужно полностью указать, как добраться до необработанного указателя в интеллектуальном указателе, но правила слева/справа не выполняются (и не выполняется правило удаления).