web-dev-qa-db-fra.com

Comment afficher un tableau alloué dynamiquement dans le débogueur Visual Studio?

Si vous disposez d'un tableau alloué statiquement, le débogueur Visual Studio peut facilement afficher tous les éléments du tableau. Cependant, si vous disposez d'un tableau alloué dynamiquement et pointé par un pointeur, il n'affichera le premier élément du tableau que lorsque vous cliquez sur le + pour le développer. Existe-t-il un moyen simple de dire au débogueur, de me montrer ces données sous la forme d'un tableau de type Foo et de taille X?

142
Adam Rosenfield

Oui, simple. dis que tu as

char *a = new char[10];

écrit dans le débogueur:

a,10

vous montrerait le contenu comme s'il s'agissait d'un tableau.

187
shoosh

Il existe deux méthodes pour afficher les données dans un tableau 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
};

Une façon consiste à utiliser une fenêtre de surveillance (Debug/Windows/Watch). Ajouter une montre =

m4x4,16

Cela affiche les données dans une liste:

enter image description here

Une autre façon est d'utiliser une fenêtre Mémoire (Debug/Windows/Memory). Spécifiez une adresse de début de mémoire =

m4x4

Cela affiche les données dans un tableau, ce qui est mieux pour les matrices bidimensionnelles et tridimensionnelles:

enter image description here

Cliquez avec le bouton droit sur la fenêtre Mémoire pour déterminer comment les données binaires sont visualisées. Les choix sont limités aux nombres entiers, flottants et certains encodages de texte.

32
Riaz Rizvi

Dans une fenêtre de surveillance, ajoutez une virgule après le nom du tableau et le nombre d'éléments que vous souhaitez afficher.

21
Drealmer

une revisite:

supposons que vous avez un pointeur ci-dessous:

double ** a; // assume 5*10

vous pouvez ensuite écrire ci-dessous dans la veille de débogage de Visual Studio:

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

qui le jettera dans un tableau comme ci-dessous, et vous pouvez afficher tout le contenu en une seule fois.

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

Pour,

int **a; //row x col

ajouter ceci pour regarder

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

Encore une autre façon de le faire est spécifiée ici dans MSDN .

En bref, vous pouvez afficher un tableau de caractères sous forme de plusieurs types de chaîne. Si vous avez un tableau déclaré comme:

char *a = new char[10];

Vous pouvez l'imprimer sous forme de chaîne unicode dans la fenêtre de surveillance avec les éléments suivants:

a,su

Voir les tableaux sur la page MSDN pour toutes les différentes conversions possibles car il y en a plusieurs. De nombreuses variantes de chaînes différentes, des variantes pour imprimer des éléments individuels dans le tableau, etc.

4
Taylor Price

Pour les tableaux MFC (CArray, CStringArray, ...) en suivant le lien suivant dans son Astuce # 4

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

Par exemple pour "CArray pArray", ajoutez dans les fenêtres Watch

     pArray.m_pData,5 

pour voir les 5 premiers éléments.

Si pArray est un CArray bidimensionnel, vous pouvez regarder n'importe quel élément de la deuxième dimension en utilisant la syntaxe suivante:

     pArray.m_pData[x].m_pData,y
1
dabinsi

Vous pouvez trouver une liste de beaucoup de choses que vous pouvez faire avec des variables dans la fenêtre de surveillance dans ce joyau dans les documents: https://msdn.Microsoft.com/en-us/library/75w45ekt.aspx

Pour une variable a, il y a les choses déjà mentionnées dans d'autres réponses comme

a,10 
a,su 

mais il y a beaucoup d'autres spécificateurs de format et de taille, comme:

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

Je n'ai pas trouvé de moyen de l'utiliser avec un tableau multidimensionnel. Mais vous pouvez au moins (si vous connaissez l'index de votre entrée souhaitée) ajouter une montre à une valeur spécifique. Utilisez simplement l'opérateur d'index.

Pour un tableau nommé current, qui contient un tableau nommé Attribs à l'intérieur, qui a un tableau nommé Attrib à l'intérieur, il devrait ressembler à ceci si vous souhaitez avoir la position 26:

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

Vous pouvez également utiliser un décalage

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

montrera les 25 éléments "suivants". (J'utilise VS2008, cela ne montre que 25 éléments maximum).

0
wog