14

在 Visual Studio 2012 中,我正在寻找一种方法来自定义 Autos、Locals 和 Watch 窗口中浮点类型的默认显示。我熟悉 Native Visualizer (Natvis) 实用程序,但没有看到任何调试器格式化工具来完成此操作。同样,我不知道有任何方法可以覆盖任何原始类型的默认显示(除了启用十六进制)。

目标是为与点、几何向量等对应的类型创建具有较少扩展位数的显示字符串,但在扩展类型时仍会显示所有精度。因此,例如,我可能有一个点类型的变量,(0.000, 1.234, 2.429)而不是m_x = 0.00000000, m_y = 1.234245213...在 Autos 窗口的中间列中显示。

我查看了此页面上的格式说明符,但没有看到控制浮点精度的方法。

4

6 回答 6

13

尽管他们的文档似乎不支持它,但我们使用以下定义来缩短数字(在 VS 2015 中):

  <Type Name="MyVec3d">
    <DisplayString>{vectorX,g}, {vectorY,g}, {vectorZ,g}</DisplayString>
  </Type>
于 2016-04-07T16:23:47.360 回答
4

不幸的是,实际上没有办法在 C++ 调试中进行这种细粒度级别的更改。在托管语言中,在某些有限的场景中是可能的(当原语是对象的字段并使用特殊[DebuggerDisplay]属性进行注释时)。对于 C++,虽然这种类型的定制并不存在。

于 2013-12-19T20:40:00.343 回答
2

当前不能对原始类型进行 NatVizzed。但是,如果您要查看的特定原语是您可以查看的另一种类型的成员,则可以将格式应用于该类型,例如

<!-- displays the double value as 0.000 -->
<Type Name="DoubleHolder">
  <DisplayString>{(int)myDouble}.{(int)(myDouble*1000) % 1000}</DisplayString>
</Type>
于 2014-10-28T16:50:36.370 回答
2

根据Overlord Zurg 的回答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&lt;0?-1:1)*10*m_x) % 10}{(int)((m_x&lt;0?-1:1)*100*m_x) % 10}{(int)((m_x&lt;0?-1:1)*1000*m_x) % 10}
  </DisplayString>
</Type>
于 2020-01-28T12:13:43.347 回答
1

你对此没有太多控制权。但是,我们可以通过将双打转换为浮点数以进行预览,从而获得比默认视图更好的效果:

<DisplayString>{{x={(float)x} y={(float)y}}}</DisplayString>

我们在展开版本中将它们保留为双精度值,以便您可以看到真实值。这足以让我们水平包装四个或五个值,而不是通常的三个。这仍然有一些缺点:浮点数的最后几个数字将是垃圾,并且可能会让您认为您有精度错误,而实际上您没有。但是,在 Microsoft 开始为数字输出添加适当的格式说明符之前,这可能是我们能做的最好的事情。

顺便说一句,如果值通常足够大,则可以通过将浮点数转换为整数来获得类似的“切碎精度”。

于 2015-01-16T23:55:33.970 回答
1

我知道的唯一方法是编写一个本地可视化 DLL。请参阅问题“如何为 Visual Studio 2012 调试器编写自定义本机可视化器 DLL?”的答案。.

我已经成功地使用它以及该答案中链接的源来编写自定义可视化工具,以我想要的精度显示各种类型的浮点成员。

于 2015-12-03T12:39:02.513 回答