Natvis 浮点格式

ima*_*ett 7 natvis visual-studio-2015

昨天我发现了MSVC 的“Natvis”工具,它允许您调整调试器以智能方式呈现您的类型。我很快着手美化我的数学图书馆。

这是我的 3*3 矩阵类的外观(未初始化的数据):

矩阵 3x3

华丽,对吧?我的下午没有后悔。

但是,现在我们要处理一个稍微复杂的案例:

矩阵 4x4

如您所见,数字不对齐。我想出了一个办法 讨厌缸与正数得到负数对齐,但我的方法没有接近这个(这是我的基本轮廓)的方式:

<Type ...>
    <DisplayString>...</DisplayString>
    <Expand ...>
        <Synthetic ...>
            <DisplayString ...>...</DisplayString>
        </Synthetic>
        ...
    </Expand>
</Type>
Run Code Online (Sandbox Code Playgroud)

发生的事情是打印的数字数量因数字而

因此我的问题是:我可以将 Natvis 配置为打印明确定义的位数以进行调试吗?或者,也许您有一个聪明的解决方法?


PS:如果我能成功,我很乐意上传生成“.natvis”文件的 Python 脚本,供你们玩自己的类型。

ta5*_*55e 3

如果您仍然感兴趣:一个令人讨厌的解决方法是计算 natvis 中点之后的每个数字,并提供一个帮助器类型,您可以将 POD 数据类型转换为:

首先,在源代码中引入一个简单的结构,该结构仅在代码中保存 float 或 double 成员。这使您能够将浮点值转换为 NATVIS_FLOAT 并访问该数字。

struct NATVIS_FLOAT { float f;}
Run Code Online (Sandbox Code Playgroud)

现在您可以为 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>
Run Code Online (Sandbox Code Playgroud)

最后,您可以将矩阵的浮动成员转换为 NATVIS_FLOAT。如果你的矩阵有一个成员 float m[9] 你可以想象一个条目像

{(NATVIS_FLOAT*)&m[2],na}
Run Code Online (Sandbox Code Playgroud)