Como exibir uma matriz alocada dinamicamente no depurador do Visual Studio?

144

Se você tiver uma matriz alocada estaticamente, o depurador do Visual Studio poderá exibir facilmente todos os elementos da matriz. No entanto, se você tiver uma matriz alocada dinamicamente e apontada por um ponteiro, ela exibirá apenas o primeiro elemento da matriz quando você clicar no + para expandi-lo. Existe uma maneira fácil de dizer ao depurador, mostre-me esses dados como uma matriz do tipo Foo e tamanho X?

Adam Rosenfield
fonte

Respostas:

196

Sim simples. diga que você tem

char *a = new char[10];

escrevendo no depurador:

a,10

mostraria o conteúdo como se fosse uma matriz.

shoosh
fonte
10
Esse é um ótimo truque, mas se o ponteiro apontar para uma variedade de estruturas, descobri que os elementos individuais expandidos com "a, 10" na janela de inspeção não são expansíveis. Ou seja, você não pode cavar no terceiro elemento da matriz usando esse método. Isso é algo que pode ser superado?
SirPentor
@ Sir Pentor Eu tenho o mesmo problema. Você encontrou uma solução?
Becko
@ Becko - negativo. É frustrante.
precisa saber é o seguinte
wow, seu inútil para estruturas, você pode apenas ver os nomes dos vars, não valores
Icebone1000
2
Para iniciantes: se você selecionar a variável "a", clique com o botão direito do mouse e adicione à lista de observação (inspecionar), se abrir a exibição do depurador na lista de valores observados (não consigo encontrar o nome da janela no momento) pode clicar duas vezes em "a" e renomeá-lo "a, X" onde X é o número de itens. Você verá agora todos os valores.
darkgaze
33

Existem dois métodos para visualizar dados em uma 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
};

Uma maneira é com uma janela do Watch (Debug / Windows / Watch). Adicionar relógio =

m4x4,16

Isso exibe dados em uma lista:

insira a descrição da imagem aqui

Outra maneira é com uma janela de memória (Debug / Windows / Memory). Especifique um endereço inicial da memória =

m4x4

Isso exibe dados em uma tabela, o que é melhor para matrizes bidimensionais e tridimensionais:

insira a descrição da imagem aqui

Clique com o botão direito do mouse na janela Memória para determinar como os dados binários são visualizados. As opções são limitadas a números inteiros, flutuantes e algumas codificações de texto.

Riaz Rizvi
fonte
21

Em uma janela de inspeção, adicione uma vírgula após o nome da matriz e a quantidade de itens que você deseja exibir.

Drealmer
fonte
10

uma revisitar:

Vamos supor que você tenha um ponteiro abaixo:

double ** a; // assume 5*10

então você pode escrever abaixo no relógio de depuração do Visual Studio:

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

que o converterá em uma matriz como abaixo, e você poderá visualizar todo o conteúdo de uma só vez.

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

Para,

int **a; //row x col

adicione isso para assistir

(int(**)[col])a,row
vicky
fonte
Por favor, diga-me, não consigo encontrar "relógio". Cadê?
Egor Randomize
4

Ainda outra maneira de fazer isso é especificada aqui no MSDN .

Em resumo, você pode exibir uma matriz de caracteres como vários tipos de sequência. Se você tem uma matriz declarada como:

char *a = new char[10];

Você pode imprimi-lo como uma string unicode na janela de inspeção com o seguinte:

a,su

Veja as tabelas na página MSDN para todas as diferentes conversões possíveis, pois existem algumas. Muitas variantes de sequência diferentes, variantes para imprimir itens individuais na matriz, etc.

Preço de Taylor
fonte
1
No link do MSDN que você forneceu - a,[10]permite ver elementos individuais para que eles próprios sejam expansíveis, mesmo se você tiver um CArray de tipos de dados complexos.
LThode 5/05
1

Você pode encontrar uma lista de muitas coisas que você pode fazer com variáveis ​​na janela de inspeção nesta joia nos documentos: https://msdn.microsoft.com/en-us/library/75w45ekt.aspx

Para uma variável a, existem as coisas já mencionadas em outras respostas, como

a,10 
a,su 

mas há muitos outros especificadores para formato e tamanho, 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
fonte
0

Não encontrei uma maneira de usar isso com uma matriz multidimensional. Mas você pode pelo menos (se você conhece o índice da entrada desejada) adicionar um relógio a um valor específico. Basta usar o operador de índice.

Para uma matriz denominada current, que possui uma matriz denominada Attribs dentro, que possui uma matriz denominada Attrib dentro, deve ser assim se você quiser ter que posicionar 26:

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

Você também pode usar um deslocamento

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

mostrará ne "próximos" 25 elementos. (Estou usando o VS2008, isso mostra apenas 25 elementos no máximo).

wog
fonte