1

我有一个结构

struct Matrix2d
{
    // Column first ordered elements
    vector<int> m_elements;
    int m_numRows;
    int m_numCols;
};

m_elements 存储 {0, 1, 2, 3, 4, 5, 6, 7, 8} 来表示二维矩阵

0, 3, 6
1, 4, 7
2, 5, 8

我想显示如下: 在此处输入图像描述

使用 Natvis 中的 ArrayItems 功能,我可以得出以下结论: 在此处输入图像描述

使用 natvis 代码:

  <Type Name="Matrix2d">
    <Expand>
      <ArrayItems>
        <Direction>Backward</Direction>
        <Rank>2</Rank>
        <Size>$i==0?m_numRows:m_numCols</Size>
        <ValuePointer>&amp;m_elements[0]</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>

但这真的很难看,我宁愿每一行都是一个项目,而不是每个元素都是一个项目,就像 array2d 的可视化方式一样。

您将如何在 Natvis 中编写代码以使 Matrix2d 可以以这种方式可视化?

4

1 回答 1

1

对于这样的结构,我更喜欢使用CustomListItems. 在您的情况下,它可能如下所示:

  <Type Name="Matrix2d">
    <Expand>
      <CustomListItems>
        <Variable Name="i" InitialValue="0"/>
        <Loop Condition="i  &lt; m_numRows">
          <Item Name="{i}">&amp;m_elements[i * m_numCols],[m_numCols]na</Item>
          <Exec>++i</Exec>
        </Loop>
      </CustomListItems>
    </Expand>
  </Type>

例子:

struct Matrix2d
{
    Matrix2d(int r, int c) : m_numRows(r), m_numCols(c), m_elements(r * c, 0) {}
    // Column first ordered elements
    std::vector<int> m_elements;
    int m_numRows;
    int m_numCols;
};
Matrix2d g(4, 3);

例子

于 2020-11-19T14:11:52.893 回答