在C ++中,我有一个我想要可视化的整数数组,这些元素是这样的:
[0] <range 1 start, e.g. 1253>
[1] <range 1 end, e.g. 1320>
[2] <range 2 start, e.g. 1852>
[3] <range 2 end, e.g. 2528>
...
[n] 0
所以,我想将它想象成具有自定义表示,其中每个可视化项目都像[0] <1253-1320>
; [1] <1852-2528>
等。
目前,我有这个(没有给我预期的结果):
<CustomListItems>
<Variable Name='pCurRange' InitialValue='m_pWhichRanges'/>
<Variable Name='i' InitialValue='0'/>
<Loop Condition='*pCurRange'>
<Item Name='[{i,d}] begin'>*pCurRange</Item>
<Item Name='[{i,d}] end'>*(pCurRange+1)</Item>
<Exec>pCurRange+=2</Exec>
<Exec>++i</Exec>
</Loop>
</CustomListItems>
但我希望每个项目都是这样的(用DisplayString语法):
<Item>{*pCurRange} - {*(pCurRange+1)}</Item>
由于item元素的内容不能是这个,我似乎无法做到这一点。此外,我没有看到在可视化工具中定义字符串(或字符数组)变量的方法,并在Item元素之前构造它 - 最重要的是,可视化工具没有可用的字符串修饰符intrinsics。并且在项目的Name属性中执行它不是一个选项,因为我需要在Value列中。
可以用某种方式完成吗?
编辑:this是实现所需视图所需内容的请求。
答案 0 :(得分:2)
我认为natvis中没有直接的方法可以做到这一点。但是,为什么不更改代码以更好地适应数据结构呢?首先声明一个
struct Range {
int begin;
int end;
}
,然后让m_pWhichRanges
指向Range
而不是int
(甚至最好将其指向std::vector
或std::array
或{{ 1}})。如果无法做到这一点,请确保在代码中的任何地方都使用gsl::span
,以便调试器可以看到该类型。例如添加
struct Range
到您的结构/类。
现在您拥有Range* as_ranges() { return reinterpret_cast<Range*>(m_pWhichRanges); }
类型,可以将Range
显示为m_pWhichRanges
的自定义列表,并让每个Range
神奇地显示自己。
Range
请注意,我在<CustomListItems>
<Variable Name='pCurRange' InitialValue='(Range*)m_pWhichRanges'/>
<Variable Name='i' InitialValue='0'/>
<Loop Condition='pCurRange->begin'>
<Item Name='[{i,d}]'>pCurRange,na</Item>
<Exec>++pCurRange</Exec>
<Exec>++i</Exec>
</Loop>
</CustomListItems>
项目中添加了,na
,以便不显示地址。
不需要这样做,但是如果您愿意,现在可以将范围显示微调为例如。
pCurRange