Как отобразить динамически выделенный массив в отладчике Visual Studio?

Если у вас есть статически выделенный массив, отладчик Visual Studio может легко отображать все элементы массива. Однако, если у вас есть массив, выделенный динамически и указатель на указатель, он будет отображать только первый элемент массива, когда вы нажимаете +, чтобы развернуть его. Есть ли простой способ сказать отладчику, показать мне эти данные как массив типа Foo и размер X?

Ответ 1

Да, просто. скажем, у вас

char *a = new char[10];

запись в отладчик:

a,10

покажет вам содержимое, как если бы оно было массивом.

Ответ 2

Существует два метода просмотра данных в массиве m4x4:

float m4x4[16]={
    1.f,0.f,0.f,0.f,
    0.f,2.f,0.f,0.f,
    0.f,0.f,3.f,0.f,
    0.f,0.f,0.f,4.f
};

Один из способов - это окно Watch (Debug/Windows/Watch). Добавить watch =

m4x4,16

Это отображает данные в списке:

enter image description here

Другой способ - это окно памяти (Debug/Windows/Memory). Укажите начальный адрес памяти =

m4x4

Это отображает данные в таблице, что лучше для двух и трехмерных матриц:

enter image description here

Щелкните правой кнопкой мыши по окну Память, чтобы определить, как визуализируются двоичные данные. Выбор ограничен целыми числами, поплавками и некоторыми текстовыми кодировками.

Ответ 3

В окне просмотра добавьте запятую после имени массива и количество элементов, которые вы хотите отобразить.

Ответ 4

a revisit:

предположим, что у вас есть указатель внизу:

double ** a; // assume 5*10

то вы можете написать ниже в Visual Studio debug watch:

(double(*)[10]) a[0],5

который выведет его в массив, как показано ниже, и вы можете просмотреть все содержимое за один раз.

double[5][10] a;

Ответ 5

Еще один способ сделать это указан здесь в MSDN.

Короче говоря, вы можете отобразить массив символов как несколько типов строк. Если у вас есть массив, объявленный как:

char *a = new char[10];

Вы можете напечатать его как строку юникода в окне просмотра со следующим:

a,su

См. таблицы на странице MSDN для всех возможных преобразований, так как их довольно много. Много разных вариантов строк, варианты для печати отдельных элементов в массиве и т.д.

Ответ 6

Для

int **a; //row x col

добавить это, чтобы посмотреть

(int(**)[col])a,row

Ответ 7

Для массивов MFC (CArray, CStringArray,...) следуя следующей ссылке в подсказке # 4

http://www.codeproject.com/Articles/469416/10-More-Visual-Studio-Debugging-Tips-for-Native-De

Например, для "CArray pArray" добавьте в окна "Часы"

     pArray.m_pData,5 

чтобы увидеть первые 5 элементов.

Если pArray является двумерным CArray, вы можете посмотреть на любой из элементов второго измерения, используя следующий синтаксис:

     pArray.m_pData[x].m_pData,y

Ответ 8

Вы можете найти список многих вещей, которые вы можете сделать с переменными в окне часов в этом драгоценном камне в документах: https://msdn.microsoft.com/en-us/library/75w45ekt.aspx

Для переменной a существуют вещи, уже упомянутые в других ответах, таких как

a,10 
a,su 

но есть много других спецификаций для формата и размера, например:

a,en (shows an enum value by name instead of the number)
a,mb (to show 1 line of 'memory' view right there in the watch window)

Ответ 9

Я не нашел способ использовать это с многомерным массивом. Но вы можете по крайней мере (если знаете индекс своей желаемой записи) добавить часы к определенному значению. Просто используйте индекс-оператор.

Для массива с именем current, у которого есть Array с именем Attribs внутри, который имеет Array с именем Attrib внутри, он должен выглядеть так, если вам нравится иметь позицию 26:

((*((*current).Attribs)).Attrib)[26]

Вы также можете использовать смещение

((*((*current).Attribs)).Attrib)+25

покажет ne "next" 25 элементов. (Я использую VS2008, это показывает только 25 элементов максимум).