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


144

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

Ответы:


196

Да просто. скажи, что у тебя есть

char *a = new char[10];

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

a,10

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


10
Это отличный трюк, но если ваш указатель указывает на массив структур, я обнаружил, что отдельные элементы, развернутые с помощью «a, 10» в окне просмотра, сами по себе не расширяются. Это означает, что вы не можете копаться в 3-м элементе массива, используя этот метод. Это то, что можно преодолеть?
SirPentor

@SirPentor У меня та же проблема. Вы нашли решение?
becko

@ becko - негативный. Это расстраивает.
SirPentor

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

2
Для начинающих: если вы выберете переменную «a», щелкните правой кнопкой мыши и добавите в список наблюдения (осмотрите), если вы откроете представление de debugger в списке наблюдаемых значений (я не могу сейчас найти название окна), вы можно дважды щелкнуть «a» и переименовать его в «a, X», где X - количество элементов. Теперь вы увидите все значения.
даркгейм

33

Есть два способа просмотра данных в массиве 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

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

введите описание изображения здесь

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


21

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


10

повторное посещение:

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

double ** a; // assume 5*10

тогда вы можете написать ниже в Visual Studio отладочные часы:

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

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

double[5][10] a;


4

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

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

char *a = new char[10];

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

a,su

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


1
По предоставленной вами ссылке MSDN - a,[10]позволяет просматривать отдельные элементы, чтобы они сами расширялись, даже если у вас есть CArray сложных типов данных.
LThode

1

Для массивов 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

1

Вы можете найти список многих вещей, которые вы можете сделать с переменными, в окне просмотра этого драгоценного камня в документации: 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)

0

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

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.