Bagaimana cara menampilkan array yang dialokasikan secara dinamis di debugger Visual Studio?


144

Jika Anda memiliki array yang dialokasikan secara statis, debugger Visual Studio dapat dengan mudah menampilkan semua elemen array. Namun, jika Anda memiliki array yang dialokasikan secara dinamis dan diarahkan oleh sebuah pointer, array hanya akan menampilkan elemen pertama dari array ketika Anda mengklik + untuk mengembangkannya. Apakah ada cara mudah untuk memberi tahu debugger, tunjukkan data ini kepada saya sebagai array tipe Foo dan ukuran X?

Jawaban:


196

Ya sederhana. katakan kamu punya

char *a = new char[10];

menulis di debugger:

a,10

akan menunjukkan kepada Anda konten seolah-olah itu array.


10
Itu trik yang bagus, tetapi jika pointer Anda menunjuk ke array struktur, saya telah menemukan bahwa elemen individu diperluas dengan "a, 10" di jendela arloji itu sendiri tidak dapat diperluas. Berarti Anda tidak dapat menggali elemen ke-3 dari array menggunakan metode ini. Apakah itu sesuatu yang bisa diatasi?
SirPentor

@ SirPentor Saya memiliki masalah yang sama. Sudahkah Anda menemukan solusinya?
becko

@ becko - negatory. Ini membuat frustrasi.
SirPentor

wow, tidak berguna untuk struktur, Anda hanya bisa melihat nama vars, bukan nilai
Icebone1000

2
Untuk pemula: Jika Anda memilih variabel "a", klik kanan dan tambahkan ke daftar tontonan (periksa), jika Anda membuka tampilan de debugger dalam daftar nilai yang ditonton (saya tidak dapat menemukan nama jendela sekarang), Anda dapat mengklik dua kali "a" dan menamainya "a, X" di mana X adalah jumlah item. Anda akan melihat semua nilai sekarang.
darkgaze

33

Ada dua metode untuk melihat data dalam array 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
};

Salah satu caranya adalah dengan jendela Watch (Debug / Windows / Watch). Tambahkan arloji =

m4x4,16

Ini menampilkan data dalam daftar:

masukkan deskripsi gambar di sini

Cara lain adalah dengan jendela Memory (Debug / Windows / Memory). Tentukan alamat mulai memori =

m4x4

Ini menampilkan data dalam sebuah tabel, yang lebih baik untuk matriks dua dan tiga dimensi:

masukkan deskripsi gambar di sini

Klik kanan pada jendela Memori untuk menentukan bagaimana data biner divisualisasikan. Pilihan terbatas pada bilangan bulat, float, dan beberapa penyandian teks.


21

Di jendela arloji, tambahkan koma setelah nama array, dan jumlah item yang ingin ditampilkan.


10

kunjungan kembali:

mari kita asumsikan Anda memiliki pointer di bawah ini:

double ** a; // assume 5*10

maka Anda dapat menulis di bawah ini di Visual Studio debug watch:

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

yang akan melemparkannya ke dalam array seperti di bawah ini, dan Anda dapat melihat semua konten sekaligus.

double[5][10] a;

5

Untuk,

int **a; //row x col

tambahkan ini untuk ditonton

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

Tolong, katakan padaku, saya tidak dapat menemukan "menonton". Dimana itu?
Egor Randomize

4

Namun cara lain untuk melakukan ini ditentukan di sini di MSDN .

Singkatnya, Anda dapat menampilkan array karakter sebagai beberapa jenis string. Jika Anda memiliki array yang dinyatakan sebagai:

char *a = new char[10];

Anda dapat mencetaknya sebagai string unicode di jendela arloji dengan berikut:

a,su

Lihat tabel di halaman MSDN untuk semua konversi berbeda yang mungkin karena ada beberapa. Banyak varian string berbeda, varian untuk mencetak masing-masing item dalam array, dll.


1
Dari tautan MSDN yang Anda berikan - a,[10]memungkinkan Anda untuk melihat elemen individual sehingga mereka sendiri dapat diperluas, bahkan jika Anda memiliki CArray tipe data yang kompleks.
LThode


1

Anda dapat menemukan daftar banyak hal yang dapat Anda lakukan dengan variabel di jendela arloji dalam permata ini di dokumen: https://msdn.microsoft.com/en-us/library/75w45ekt.aspx

Untuk variabel a, ada hal-hal yang sudah disebutkan dalam jawaban lain seperti

a,10 
a,su 

tetapi ada banyak penentu lain untuk format dan ukuran, seperti:

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

Saya belum menemukan cara untuk menggunakan ini dengan array multidimensi. Tapi Anda setidaknya bisa (jika Anda tahu indeks entri yang Anda inginkan) menambahkan arloji ke nilai tertentu. Cukup gunakan indeks-operator.

Untuk Array bernama arus, yang memiliki Array bernama Attribs di dalamnya, yang memiliki Array bernama Attrib di dalamnya, akan terlihat seperti ini jika Anda ingin posisi 26:

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

Anda juga dapat menggunakan offset

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

akan menampilkan 25 elemen berikutnya. (Saya menggunakan VS2008, ini hanya menunjukkan maksimum 25 elemen).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.