Як відобразити динамічно розподілений масив у відладчику Visual Studio?


144

Якщо у вас є статично розподілений масив, налагоджувач Visual Studio може легко відображати всі елементи масиву. Однак якщо у вас масив, розподілений динамічно і на нього вказується вказівником, він відображатиме перший елемент масиву лише після натискання кнопки +, щоб розгорнути його. Чи є простий спосіб сказати налагоджувачу, показати мені ці дані як масив типу Foo та розміру X?

Відповіді:


196

Так, просто. скажіть, у вас є

char *a = new char[10];

написання на відладчику:

a,10

показав би вам вміст, ніби це масив.


10
Це чудова хитрість, але якщо ваш покажчик вказує на масив структур, я виявив, що окремі елементи, розширені на "a, 10" у вікні годинника, самі по собі не розширюються. Це означає, що ви не можете копатись до 3-го елемента масиву за допомогою цього методу. Це щось, що можна подолати?
СерПентор

@SirPentor У мене те саме питання. Ви знайшли рішення?
бекко

@ becko - недбалий. Це засмучує.
СерПентор

Уау, його марність для структур, ви можете просто побачити назви vars, а не значення
Icebone1000

2
Для початківців: Якщо ви вибрали змінну "a", клацніть правою кнопкою миші та додайте до списку перегляду (перевірити), якщо ви відкриєте перегляд налагодження у списку переглянутих значень (я не можу знайти ім'я вікна зараз), ви може двічі клацнути "a" і перейменувати його на "a, X", де X - кількість елементів. Тепер ви побачите всі значення.
darkgaze

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
};

Один із способів - за допомогою вікна Watch (Налагодження / Windows / Watch). Додати годинник =

m4x4,16

Це відображає дані у списку:

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

Інший спосіб - за допомогою вікна пам'яті (налагодження / Windows / пам'ять). Вкажіть початкову адресу пам'яті =

m4x4

Це відображає дані в таблиці, що краще для дво- та тривимірних матриць:

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

Клацніть правою кнопкою миші на вікні Пам'ять, щоб визначити, як візуалізуються двійкові дані. Вибір обмежений цілими числами, плавцями та деякими текстовими кодуваннями.


21

У вікні перегляду додайте кому після назви масиву та кількості елементів, які потрібно відобразити.


10

повторне відвідування:

припустимо, у вас є покажчик нижче:

double ** a; // assume 5*10

то ви можете записати нижче в годинник налагодження Visual Studio:

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

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

double[5][10] a;

5

Бо

int **a; //row x col

додайте це для перегляду

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

Скажіть, будь ласка, я не можу знайти "годинник". Де це?
Egor Randomize

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", додайте у вікна Watch

     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 є речі, про які вже говорилося в інших відповідях

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

Я не знайшов способу використовувати це з багатовимірним масивом. Але ви можете принаймні (якщо ви знаєте індекс потрібного запису) додати годинник до певного значення. Просто використовуйте індекс-оператор.

Для поточного масиву з ім'ям, який має масив з ім'ям 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.