¿Cómo mostrar una matriz asignada dinámicamente en el depurador de Visual Studio?

144

Si tiene una matriz asignada estáticamente, el depurador de Visual Studio puede mostrar fácilmente todos los elementos de la matriz. Sin embargo, si tiene una matriz asignada dinámicamente y señalada por un puntero, solo mostrará el primer elemento de la matriz cuando haga clic en + para expandirla. ¿Hay una manera fácil de decirle al depurador, muéstrame estos datos como una matriz de tipo Foo y tamaño X?

Adam Rosenfield
fuente

Respuestas:

196

Si, simple di que tienes

char *a = new char[10];

escribiendo en el depurador:

a,10

le mostraría el contenido como si fuera una matriz.

shoosh
fuente
10
Es un gran truco, pero si su puntero apunta a una variedad de estructuras, he descubierto que los elementos individuales expandidos con "a, 10" en la ventana de observación no son expandibles. Lo que significa que no puede profundizar en el tercer elemento de la matriz con este método. ¿Es algo que se puede superar?
SirPentor
@SirPentor Tengo el mismo problema. ¿Has encontrado una solución?
Becko
@ becko - negativo. Es frustrante.
SirPentor
wow, es inútil para estructuras, solo puedes ver los nombres de los vars, no los valores
Icebone1000
2
Para principiantes: si selecciona la variable "a", haga clic derecho y agregue a la lista de observación (inspeccionar), si abre la vista de depurador en la lista de valores observados (no puedo encontrar el nombre de la ventana en este momento), usted puede hacer doble clic en "a" y cambiarle el nombre por "a, X", donde X es el número de elementos. Verá ahora todos los valores.
darkgaze
33

Hay dos métodos para ver datos en una matriz 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
};

Una forma es con una ventana Watch (Debug / Windows / Watch). Agregar reloj =

m4x4,16

Esto muestra datos en una lista:

ingrese la descripción de la imagen aquí

Otra forma es con una ventana de Memoria (Debug / Windows / Memory). Especifique una dirección de inicio de memoria =

m4x4

Esto muestra los datos en una tabla, que es mejor para matrices de dos y tres dimensiones:

ingrese la descripción de la imagen aquí

Haga clic derecho en la ventana Memoria para determinar cómo se visualizan los datos binarios. Las opciones están limitadas a enteros, flotantes y algunas codificaciones de texto.

Riaz Rizvi
fuente
21

En una ventana de observación, agregue una coma después del nombre de la matriz y la cantidad de elementos que desea que se muestren.

Drealmer
fuente
10

una nueva visita:

supongamos que tiene un puntero a continuación:

double ** a; // assume 5*10

entonces puede escribir a continuación en el reloj de depuración de Visual Studio:

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

que lo convertirá en una matriz como la siguiente, y puede ver todos los contenidos de una sola vez.

double[5][10] a;
Gengpu Liu
fuente
5

Por,

int **a; //row x col

agrega esto para mirar

(int(**)[col])a,row
vicky
fuente
Por favor, dime, no puedo encontrar "reloj". ¿Dónde está?
Egor Aleatorizar
4

Otra forma de hacer esto se especifica aquí en MSDN .

En resumen, puede mostrar una matriz de caracteres como varios tipos de cadena. Si tienes una matriz declarada como:

char *a = new char[10];

Puede imprimirlo como una cadena Unicode en la ventana del reloj con lo siguiente:

a,su

Consulte las tablas en la página de MSDN para ver todas las conversiones posibles, ya que hay bastantes. Muchas variantes de cadena diferentes, variantes para imprimir elementos individuales en la matriz, etc.

Taylor Price
fuente
1
Desde el enlace MSDN que proporcionó, le a,[10]permite ver elementos individuales para que ellos mismos sean expandibles, incluso si tiene una matriz de tipos de datos complejos.
LThode
1

Puede encontrar una lista de muchas cosas que puede hacer con las variables en la ventana de observación en esta joya en los documentos: https://msdn.microsoft.com/en-us/library/75w45ekt.aspx

Para una variable a, están las cosas ya mencionadas en otras respuestas como

a,10 
a,su 

pero hay muchos otros especificadores para formato y tamaño, como:

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)
Legolas
fuente
0

No he encontrado una manera de usar esto con una matriz multidimensional. Pero al menos puede (si conoce el índice de su entrada deseada) agregar un reloj a un valor específico. Simplemente use el operador de índice.

Para un Array llamado current, que tiene un Array llamado Attribs adentro, que tiene un Array llamado Attrib adentro, debería verse así si desea tener la posición 26:

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

También puedes usar un desplazamiento

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

mostrará ne "próximos" 25 elementos. (Estoy usando VS2008, esto muestra solo 25 elementos como máximo).

wog
fuente