Come visualizzare un array allocato dinamicamente nel debugger di Visual Studio?


144

Se si dispone di un array allocato staticamente, il debugger di Visual Studio può visualizzare facilmente tutti gli elementi dell'array. Tuttavia, se un array è allocato in modo dinamico e puntato da un puntatore, verrà visualizzato il primo elemento dell'array solo quando si fa clic su + per espanderlo. C'è un modo semplice per dire al debugger, mostrarmi questi dati come una matrice di tipo Foo e dimensione X?

Risposte:


196

Sì, semplice dire che hai

char *a = new char[10];

scrivendo nel debugger:

a,10

ti mostrerebbe il contenuto come se fosse un array.


10
Questo è un grande trucco, ma se il puntatore punta a una serie di strutture, ho scoperto che i singoli elementi espansi con "a, 10" nella finestra dell'orologio non sono essi stessi espandibili. Ciò significa che non è possibile scavare nel terzo elemento dell'array usando questo metodo. È qualcosa che può essere superato?
SirPentor,

@SirPentor Ho lo stesso problema. Hai trovato una soluzione?
becko,

@ Becko - negatory. È frustrante.
SirPentor,

wow, è inutile per le strutture, puoi solo vedere i nomi dei var, non i valori
Icebone1000

2
Per i principianti: se selezioni una "a" variabile, fai clic con il pulsante destro del mouse e aggiungi all'elenco di controllo (ispeziona), se apri la vista del debugger nell'elenco dei valori controllati (non riesco a trovare il nome della finestra in questo momento), tu puoi fare doppio clic su "a" e rinominarlo "a, X" dove X è il numero di elementi. Vedrai ora tutti i valori.
darkgaze

33

Esistono due metodi per visualizzare i dati in un 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
};

Un modo è con una finestra Watch (Debug / Windows / Watch). Aggiungi watch =

m4x4,16

Questo visualizza i dati in un elenco:

inserisci qui la descrizione dell'immagine

Un altro modo è con una finestra Memory (Debug / Windows / Memory). Specificare un indirizzo iniziale di memoria =

m4x4

Visualizza i dati in una tabella, che è meglio per le matrici bidimensionali e tridimensionali:

inserisci qui la descrizione dell'immagine

Fare clic con il tasto destro sulla finestra Memoria per determinare la modalità di visualizzazione dei dati binari. Le scelte sono limitate a numeri interi, float e alcune codifiche di testo.


21

In una finestra di controllo, aggiungere una virgola dopo il nome dell'array e la quantità di elementi che si desidera visualizzare.


10

una rivisitazione:

supponiamo che tu abbia un puntatore di seguito:

double ** a; // assume 5*10

quindi puoi scrivere qui sotto nel debug di Visual Studio:

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

che lo proietta in un array come sotto, e puoi vedere tutti i contenuti in una volta sola.

double[5][10] a;

5

Per,

int **a; //row x col

aggiungi questo per guardare

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

Per favore, dimmi, non riesco a trovare "guarda". Dov'è?
Egor randomizza il

4

Ancora un altro modo per farlo è specificato qui in MSDN .

In breve, è possibile visualizzare una matrice di caratteri come diversi tipi di stringa. Se hai un array dichiarato come:

char *a = new char[10];

È possibile stamparlo come stringa unicode nella finestra di controllo con quanto segue:

a,su

Vedi le tabelle nella pagina MSDN per tutte le diverse conversioni possibili poiché ce ne sono alcune. Molte varianti di stringa diverse, varianti per stampare singoli elementi nell'array, ecc.


1
Dal collegamento MSDN che hai fornito: a,[10]ti consente di vedere i singoli elementi in modo che siano essi stessi espandibili, anche se disponi di una matrice di tipi di dati complessi.
LThode,

1

Per gli array MFC (CArray, CStringArray, ...) seguendo il collegamento successivo nel suo Suggerimento n. 4

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

Ad esempio per "CArray pArray", aggiungere nelle finestre di controllo

     pArray.m_pData,5 

per vedere i primi 5 elementi.

Se pArray è un CArray bidimensionale, puoi guardare uno qualsiasi degli elementi della seconda dimensione usando la sintassi successiva:

     pArray.m_pData[x].m_pData,y

1

Puoi trovare un elenco di molte cose che puoi fare con le variabili nella finestra dell'orologio in questo gioiello nei documenti: https://msdn.microsoft.com/en-us/library/75w45ekt.aspx

Per una variabile a, ci sono le cose già menzionate in altre risposte come

a,10 
a,su 

ma ci sono molti altri specificatori per formato e dimensioni, come:

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

Non ho trovato il modo di usarlo con un array multidimensionale. Ma puoi almeno (se conosci l'indice della voce desiderata) aggiungere un orologio a un valore specifico. Usa semplicemente l'operatore indice.

Per una matrice denominata corrente, che ha una matrice denominata Attribs all'interno, con una matrice denominata Attrib all'interno, dovrebbe apparire così se si desidera posizionare 26:

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

Puoi anche usare un offset

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

mostrerà ne "prossimi" 25 elementi. (Sto usando VS2008, questo mostra solo 25 elementi al massimo).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.