如何使用natvis像2d数组一样可视化列顺序矩阵

问题描述

我有一个结构

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}来表示2d矩阵

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

我想显示如下: RPA-Python

使用Natvis中的ArrayItems功能,我可以得出以下结论:

enter image description here

使用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?

解决方法

对于这样的结构,我更喜欢使用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);

example