Визуализация деревьев в VS2008

Я добавляю визуализаторы для некоторых наших типов в autoexp.dat. Даже с тем блогом, на который все ссылаются на (, даже ребята из Microsoft! )Временами это была борьба.

Но я совершенно озадачен визуализатором дерева #. Во-первых, это сообщение в блоге кажется полным дыр в его описании (и ни в каком другом материале, который я смог найти по адресам, которые -но другие явно заставили его работать ). В частности, кажется, что есть некоторые волшебные случаи, когда он знает, что нужно разыменовать указатель -, но я не могу быть уверен, что перепроектировал намерение. Также кажется, что существует некоторая двусмысленность между использованием $c и $e. AFAICS они кажутся взаимозаменяемыми -, возможно, оба разрешены для удобства чтения? Или они действительно означают разные вещи (, например, в блоге используется $e, а визуализаторы stl, поставляемые с VS2008, используют $c ).

Но чего действительно не хватает, так это объяснения того, как все это сочетается друг с другом.Я бы предположил, что это будет следовать этому процессу:

  1. Примените правило «головы», чтобы добраться до начального узла (по указателю)
  2. Примените правило разыменования (к биту в конце )к разыменованному текущему узлу, чтобы получить значение для визуализации.
  3. Примените левое и правое правила к разыменованному текущему узлу, чтобы добраться до левого и правого узлов соответственно (по указателю -с нулем в качестве конца, если не указано правило пропуска ).
  4. Переходите к (2 ), пока все узлы не будут посещены.

Очевидно, есть алгоритм навигации влево/вправо, который я упустил. Это не слишком важно. Более важно то, какие значения учитываются на каждом этапе и когда происходит разыменование.

Кажется, это единственный процесс, который я могу себе представить, который соответствует примерам, которые я видел. Но мне не удалось заставить его работать с нашей реализацией дерева. Я просто получаю (ошибку ), где должны отображаться #дочерние элементы дерева (Я получаю одну (ошибку )для каждого узла, поэтому я предполагаю, что размер фиксируется правильно ). Я пробовал все возможные варианты, которые я могу придумать -несколько раз!

Другая вещь, которая меня озадачивает, заключается в том, что многие примеры, которые я видел, в том числе связанные stl, выполняют переход от головы к родительскому (или аналогичному )и пропускают головной узел. Почему они это делают?

Вот визуализатор, который я использую (в одной из форм, которые я пробовал -, и имена были изменены на защищенные... корпоративные):

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 m_root
    int m_size

Node:
    ValueT value
    Ptr left
    Ptr right

... где Ptr — интеллектуальный указатель, содержащий необработанный указатель в m _p.

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

12
задан JasonMArcher 16 February 2015 в 20:16
поделиться