настройка отладки многомерных массивов в visual Studio 2015 с помощью файла .natvis

#c #debugging #multidimensional-array #visual-studio-2015 #natvis

#c #отладка #многомерный массив #visual-studio-2015 #natvis

Вопрос:

Я использую arma Matrix и хотел бы взглянуть на значение во время отладки. Итак, я добавляю файл natvis следующим образом:

 <?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="arma::Matamp;<*amp;>">
    <DisplayString>{{ Size = {n_rows} x {n_cols} }}</DisplayString>
    <Expand>
      <Item Name="[size]">n_elem</Item>
      <ArrayItems>
        <Direction>Backward</Direction>
        <Rank>2</Rank>
        <Size> $i==0?n_rows:n_cols </Size>
        <ValuePointer>mem</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>
  

Однако это вообще не работает.

Раньше я понял, что проблема может быть

 <Size> $i==0?n_rows:n_rows </Size>
  

Поэтому я пытаюсь заменить его любым из следующих операторов, и это работает

 <size> $i==0?5:8 </Size>    
<size> $i==0?n_rows:8 </Size>
<Size> $i==0?5:n_cols</Size>
  

Однако, если я попробую любое из следующих утверждений, я снова ничего не получу

 <size> $i==0?n_rows:n_cols </Size>
<size> $i==0?n_rows:n_rows </Size>
  

Кстати, я изменил диагностические сообщения Natvis на «Ошибка» в настройках, но в списке ошибок ничего нет.

Спасибо за любую помощь

Комментарии:

1. насколько я понимаю, это не было бы ошибкой, это просто означает, что окно отладчика не смогло распознать конкретные теги / параметр свойства в ArrayItems, вы можете просмотреть этот пример о том, как использовать «Расширение ArrayItems» здесь: code.msdn.microsoft.com/windowsdesktop /…

2. Спасибо, Джек, но в нем приведен только пример одномерного массива. Кроме того, я прочитал объяснение MSDN, и они использовали size [$ i] в файле <size></size>, т. е. они хранят size в массиве 1 * 2, чтобы его можно было вызвать без инструкции if. Однако я использую armadillo, и размер матрицы определяется двумя целыми числами вместо массива.

3. можете ли вы поделиться со мной простым примером, использующим один диск? Я буду отлаживать его на своей стороне, используя ту же среду, что и ваша.

Ответ №1:

Приведение к int решило это для меня:

<Size> $i==0?(int)n_rows:(int)n_cols </Size>