昨天我发现了MSVC's "Natvis" tool,它允许您调整调试器以智能方式呈现您的类型。我很快就着手美化我的数学库。
以下是我的3 * 3矩阵类的外观(未初始化的数据):
华丽,对吗?我的下午没有遗憾。
然而,现在我们遇到一个稍微复杂的案例:
如您所见,数字不对齐。我已经想出了一个方式 令人讨厌的缸来让负数与正数对齐,但我的方法无法接近这个(这是我的基本大纲) :
<Type ...>
<DisplayString>...</DisplayString>
<Expand ...>
<Synthetic ...>
<DisplayString ...>...</DisplayString>
</Synthetic>
...
</Expand>
</Type>
正在发生的事情是打印的位数因数字而异。
因此我的问题:我可以配置Natvis打印定义明确的位数进行调试吗?或者,也许您有一个聪明的解决方法?
PS:我很乐意上传生成“.natvis”文件的Python脚本,让我们为你自己的类型进行游戏,如果我这样做的话。 子>
答案 0 :(得分:3)
如果您仍然感兴趣:一个讨厌的解决方法是计算natvis中的点之后的每个单个数字,并提供一个帮助类型,您可以将您的POD数据类型转换为:
首先,在源代码中引入一个简单的结构,它只在代码中包含float或double成员。这使您可以将浮点值转换为NATVIS_FLOAT并访问该数字。
struct NATVIS_FLOAT { float f;}
现在,您可以为NATVIS_FLOAT类型创建一个可视化工具,您可以在其中定义要显示的精度点之后的每个数字,例如4:
<Type Name="NATVIS_FLOAT">
<DisplayString>{(int)f}.{((int)(f*10))%10}{((int)(f*100))%10}{((int)(f*1000))%10}{((int)(f*10000))%10}</DisplayString>
</Type>
最后,您可以将矩阵的浮动成员转换为NATVIS_FLOAT。如果你的矩阵有成员浮动m [9],你可以看到一个条目,如
{(NATVIS_FLOAT*)&m[2],na}
答案 1 :(得分:2)
我今天遇到了同样的问题。经过一番挖掘,您可以通过添加'g'格式说明符来做一个更简单的本地解决方案:
<Type Name="Rect">
<DisplayString>Min({myMin.x,g},{myMin.y,g}) Max({myMax.x,g},{myMax.y,g}) Size({myMax.x-myMin.x,g},{myMax.y-myMin.y,g})</DisplayString>
<Expand>
<Item Name="[Width]">myMax.x-myMin.x,g</Item>
<Item Name="[Height]">myMax.y-myMin.y,g</Item>
</Expand>
</Type>
结果是: