Как отобразить динамически размещенный массив в отладчике Visual Studio?
Если у вас статически размещенный массив, отладчик Visual Studio может легко отобразить все элементы массива. Однако, если у вас есть массив, выделенный динамически и на который указывает указатель, он будет отображать только первый элемент массива, когда вы нажмете +, чтобы развернуть его. Есть ли простой способ сказать отладчику, показать мне эти данные в виде массива типа Foo и размера X?
9 ответов
Да просто. скажи, что у тебя есть
char *a = new char[10];
запись в отладчике:
a,10
покажет вам содержимое, как если бы это был массив.
Есть два способа просмотра данных в массиве 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
};
Одним из способов является окно просмотра (отладка /Windows/Watch). Добавить часы =
m4x4,16
Это отображает данные в списке:
Другой способ - с помощью окна памяти (отладка / Windows / память). Укажите начальный адрес памяти =
m4x4
Это отображает данные в таблице, которая лучше для двух- и трехмерных матриц:
Щелкните правой кнопкой мыши в окне "Память", чтобы определить способ визуализации двоичных данных. Выбор ограничен целыми числами, числами с плавающей точкой и некоторыми кодировками текста.
В окне просмотра добавьте запятую после имени массива и количество элементов, которые вы хотите отобразить.
Повторное посещение:
давайте предположим, что у вас есть указатель ниже:
double ** a; // assume 5*10
тогда вы можете написать ниже в Visual Studio отладочные часы:
(double(*)[10]) a[0],5
который преобразует его в массив, как показано ниже, и вы можете просмотреть все содержимое за один раз.
double[5][10] a;
За,
int **a; //row x col
добавить это, чтобы посмотреть
(int(**)[col])a,row
Еще один способ сделать это указан здесь в MSDN.
Короче говоря, вы можете отобразить массив символов в виде нескольких типов строк. Если у вас есть массив, объявленный как:
char *a = new char[10];
Вы можете напечатать его в виде строки Unicode в окне просмотра со следующим:
a,su
См. Таблицы на странице MSDN для всех возможных преобразований, так как их довольно много. Много разных строковых вариантов, варианты печати отдельных элементов в массиве и т. Д.
Вы можете найти список многих вещей, которые вы можете сделать с переменными, в окне просмотра этого драгоценного камня в документации: https://msdn.microsoft.com/en-us/library/75w45ekt.aspx
Для переменной а есть вещи, уже упомянутые в других ответах, например
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)
Для массивов 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
Я не нашел способ использовать это с многомерным массивом. Но вы можете по крайней мере (если вы знаете индекс нужной вам записи) добавить часы к определенному значению. Просто используйте индекс-оператор.
Для массива с именем current, у которого внутри есть массив с именем Attribs, внутри которого есть массив с именем Attrib, он должен выглядеть следующим образом, если вы хотите расположить 26:
((*((*current).Attribs)).Attrib)[26]
Вы также можете использовать смещение
((*((*current).Attribs)).Attrib)+25
покажет не "следующие" 25 элементов. (Я использую VS2008, это показывает только 25 элементов максимум).