Я знаю, что ArrayItems-Tag по умолчанию может обрабатывать матрицы, но я нахожу результат недостаточным.
Учитывая этот пример
#include <cstdlib>
#include <cstdio>
struct matrix {
int height;
int width;
double* values;
};
int main() {
double* values = (double*)malloc(5 * 2 * sizeof(double));
for (int i = 0; i < 10; ++i) values[i] = i * 2;
matrix m = { 5, 2, values };
return 0;
}
С этим natvis
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="matrix">
<DisplayString>{{Shape [{height} x {width}]}}</DisplayString>
<Expand>
<CustomListItems>
<Variable Name="i" InitialValue="0" />
<Loop>
<Break Condition="i == height" />
<Item>(values + (i * width)), 2</Item>
<Exec>i++</Exec>
</Loop>
</CustomListItems>
</Expand>
</Type>
</AutoVisualizer>
Результаты в этом выводе, который почти идеален.
- I wi sh адреса не будут отображаться
- I w * sh Я мог бы дать спецификатор пользовательского формата для элементы (что-то вроде% .2f)
Но я обманул в своем натвисе. Я написал <Item>(values + (i * width)), 2</Item>
2 - ширина строки. Но если я напишу width
вместо 2, он выдаст 2 вместо строк. Очевидно, он печатает значение width
, что бесполезно.
Кто-нибудь знает, как я могу сделать эти строки переменного размера?