it-swarm-eu.dev

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

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?

142
Adam Rosenfield

Sì, semplice dire che hai

char *a = new char[10];

scrivendo nel debugger:

a,10

ti mostrerebbe il contenuto come se fosse un array.

187
shoosh

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:

enter image description here

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:

enter image description here

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.

32
Riaz Rizvi

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

21
Drealmer

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;
10
Gengpu Liu

Per,

int **a; //row x col

aggiungi questo per guardare

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

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.

4
Taylor Price

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", aggiungi 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
dabinsi

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)
1
Legolas

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).

0
wog