Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于natvis的循环双链表可视化_C++_Visual Studio_Debugging_Debuggervisualizer_Natvis - Fatal编程技术网

C++ 基于natvis的循环双链表可视化

C++ 基于natvis的循环双链表可视化,c++,visual-studio,debugging,debuggervisualizer,natvis,C++,Visual Studio,Debugging,Debuggervisualizer,Natvis,我想为一个双链接列表写一篇文章。列表没有存储计数节点,简单的方法也不能很好地工作,因为扩展从未停止过(next从不为null,列表的最后一项指向列表根) 如何在natvis中向调试器解释,一旦列表再次到达根元素,它就应该停止扩展列表?natvis框架目前不支持不提供计数的循环链接列表。如果您提供一个计数,它应该会起作用。但是,如果没有计数,就没有好办法防止扩展永远继续下去。natvis框架目前不支持没有计数的循环链表。如果您提供一个计数,它应该会起作用。但是,如果没有计数,就没有好办法防止扩展永

我想为一个双链接列表写一篇文章。列表没有存储计数节点,简单的方法也不能很好地工作,因为扩展从未停止过(next从不为null,列表的最后一项指向列表根)


如何在natvis中向调试器解释,一旦列表再次到达根元素,它就应该停止扩展列表?

natvis框架目前不支持不提供计数的循环链接列表。如果您提供一个计数,它应该会起作用。但是,如果没有计数,就没有好办法防止扩展永远继续下去。

natvis框架目前不支持没有计数的循环链表。如果您提供一个计数,它应该会起作用。但是,如果没有计数,就没有好办法防止扩展永远继续下去。

我也遇到了类似的问题,不是循环列表,而是末尾有一个指向自身的哨兵节点,并提出了一个有趣的解决方案,可能适合您的需要:您可以使用三元运算符来伪造真正的终止。
中的表达式可以是用香草C编写的任何东西,因此可以在其中进行真正的计算(但遗憾的是,没有递归)

(请注意,不允许在
上放置
条件
属性,因此三元运算符是实现条件的唯一方法。)

在我的例子中,列表终止如下:

<LinkedListItems>
    <HeadPointer>this</HeadPointer>
    <NextPointer>next != this ? next : 0</NextPointer>
    <ValueNode>items</ValueNode>
</LinkedListItems>

如果你没有某种类型的
容器
返回指针,那么你可能在这方面运气不佳,因为在循环链接列表中只查看一个节点无法回答它是否实际上是“最后一个”节点。

我也有类似的问题,不是循环列表,但在末端有一个指向自身的哨兵节点,并提出了一个有趣的解决方案,可能适合您的需要:您可以使用三元运算符来伪造一个真正的终端。
中的表达式可以是用香草C编写的任何东西,因此可以在其中进行真正的计算(但遗憾的是,没有递归)

(请注意,不允许在
上放置
条件
属性,因此三元运算符是实现条件的唯一方法。)

在我的例子中,列表终止如下:

<LinkedListItems>
    <HeadPointer>this</HeadPointer>
    <NextPointer>next != this ? next : 0</NextPointer>
    <ValueNode>items</ValueNode>
</LinkedListItems>

但是,如果您没有某种类型的
容器
返回指针,您可能在这方面运气不佳,因为在循环链接列表中只查看单个节点无法回答它是否实际上是“最后一个”节点。

您可以使用
CustomListItems
元素:


*iter
iter=iter-next\u元素

CustomListItems
允许您将头部保存在变量中,以便在遍历列表时使用。如果您的头部具有不同的类型,则需要将列表节点强制转换为节点类型。

您可以使用
CustomListItems
元素执行此操作:


*iter
iter=iter-next\u元素

CustomListItems
允许您将头部保存在变量中,以便在遍历列表时使用。如果您的头部有不同的类型,那么您需要将列表节点强制转换为节点类型。

嗯,您没有向后的三元组吗?它不应该是下一个吗容器->头部?下一步:0?或者也许我不明白你在做什么?是的,这是一个倒退的版本;我会改正的。我使用的实际代码要复杂得多,因为数据结构要复杂得多,但经过几次额外的指针间接操作后,仍然松散地归结为一个循环链表。我在这篇文章中把核心逻辑提取出来的过程搞砸了。我不知道VS2012,但在VS2013中,如果列表最终命中了
中描述的指针,它也会停止列表,就像
指向nullptr一样。嗯,难道你没有三元倒排吗?它不应该是下一个吗容器->头部?下一步:0?或者也许我不明白你在做什么?是的,这是一个倒退的版本;我会改正的。我使用的实际代码要复杂得多,因为数据结构要复杂得多,但经过几次额外的指针间接操作后,仍然松散地归结为一个循环链表。我在为这篇文章提取核心逻辑时出错了。我不知道VS2012,但在VS2013中,如果列表最终命中
中描述的指针,它也会停止列表,就像
指向nullptr一样。
TListBidir<*,*,*>{
    children
    (
      #list(
        head: ((($T2 *)&$c)->next),
        next: next,
        skip : &($c)
      ): (($T1 *)(&$e))
    )
}
<LinkedListItems>
    <HeadPointer>this</HeadPointer>
    <NextPointer>next != this ? next : 0</NextPointer>
    <ValueNode>items</ValueNode>
</LinkedListItems>
<LinkedListItems>
    <HeadPointer>container-&gt;head</HeadPointer>
    <NextPointer>next != container-&gt;head ? next : 0</NextPointer>
    <ValueNode>items</ValueNode>
</LinkedListItems>
next != container->head ? next : NULL