在Visual Studio 2012中,我正在寻找一种在Autos,Locals和Watch窗口中自定义浮点类型的默认显示的方法。我熟悉Native Visualizer(Natvis)实用程序,但没有看到任何调试器格式化工具来完成此任务。同样,我不知道有任何方法可以覆盖任何基元类型的默认显示(除了启用十六进制)。
目标是为对应于点,几何向量等的类型创建具有更少位数的显示字符串,但在扩展类型时仍然显示所有精度。例如,我可能在Autos窗口的中间列中将点类型的变量显示为(0.000, 1.234, 2.429)
而不是m_x = 0.00000000, m_y = 1.234245213...
。
我浏览了this page的格式说明符,但没有看到控制浮点精度的方法。
答案 0 :(得分:11)
虽然their documentation似乎不支持,但我们使用以下定义来缩短数字(在VS 2015中):
<Type Name="MyVec3d">
<DisplayString>{vectorX,g}, {vectorY,g}, {vectorZ,g}</DisplayString>
</Type>
答案 1 :(得分:2)
不幸的是,实际上没有办法在C ++调试中进行这种细粒度的更改。在托管语言中,有可能在某些有限的场景中(当基元是对象的字段并使用特殊的[DebuggerDisplay]
属性注释时)。对于C ++,虽然这种类型的自定义不存在。
答案 2 :(得分:2)
原始类型目前无法进行Natvizzed。但是,如果您想要查看的特定基元是您可以观看的其他类型的成员,则可以将格式应用于该类型,例如
<!-- displays the double value as 0.000 -->
<Type Name="DoubleHolder">
<DisplayString>{(int)myDouble}.{(int)(myDouble*1000) % 1000}</DisplayString>
</Type>
答案 3 :(得分:2)
基于Overlord Zurg's answer,用以下三个数字显示m_x
的值:
<Type Name="Point">
<DisplayString>
{(int)m_x}.{(int)(10*m_x) % 10}{(int)(100*m_x) % 10}{(int)(1000*m_x) % 10}
</DisplayString>
</Type>
还要考虑负数:
<Type Name="Point">
<DisplayString>
{(int)m_x}.{(int)((m_x<0?-1:1)*10*m_x) % 10}{(int)((m_x<0?-1:1)*100*m_x) % 10}{(int)((m_x<0?-1:1)*1000*m_x) % 10}
</DisplayString>
</Type>
答案 4 :(得分:1)
我知道的唯一方法是编写本机可视化DLL。请参阅this answer to the question "How to write a custom native visualizer DLL for Visual Studio 2012 debugger?"。
我已经成功地使用了这个,以及在该答案中链接的源,编写自定义可视化工具,以我想要的精度显示各种类型的浮点成员。
答案 5 :(得分:0)
你无法控制这一点。我们能够比默认视图更好地获得 little 一些东西,但是,通过将我们的双精度数转换为浮点数进行预览:
<DisplayString>{{x={(float)x} y={(float)y}}}</DisplayString>
我们在展开的版本中将它们留作双打,以便您可以看到真正的价值。这足以让我们水平地打包四个或五个值,而不是通常的三个。这仍然有一些缺点:浮动上的最后几位数字将是垃圾,并且可能会让你认为你有精确错误,而事实上你并不是。但是,在微软为数字输出添加适当的格式说明符之前,这可能是我们能做的最好的。
顺便说一下,你可能会得到一个类似的&#34;切碎精度&#34;通过将浮点数转换为整数,如果值通常足够大。