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


144

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 avez un tableau alloué dynamiquement et pointé par un pointeur, il affichera uniquement le premier élément du tableau 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 forme de tableau de type Foo et de taille X?

Réponses:


196

Oui, simple. dis que tu as

char *a = new char[10];

écriture dans le débogueur:

a,10

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


10
C'est une excellente astuce, mais si votre pointeur pointe vers un tableau de structures, j'ai trouvé que les éléments individuels développés avec "a, 10" dans la fenêtre de surveillance ne sont pas eux-mêmes extensibles. Cela signifie que vous ne pouvez pas creuser dans le 3ème élément du tableau en utilisant cette méthode. Est-ce quelque chose qui peut être surmonté?
SirPentor

@SirPentor J'ai le même problème. Avez-vous trouvé une solution?
becko

@ becko - négatif. C'est frustrant.
SirPentor

wow, c'est inutile pour les structures, vous pouvez juste voir les noms des vars, pas les valeurs
Icebone1000

2
Pour les débutants: si vous sélectionnez "une" variable, faites un clic droit et ajoutez à la liste de surveillance (inspectez), si vous ouvrez la vue du débogueur dans la liste des valeurs surveillées (je ne trouve pas le nom de la fenêtre pour le moment), vous peut double-cliquer sur "a" et le renommer "a, X" où X est le nombre d'éléments. Vous verrez maintenant toutes les valeurs.
darkgaze

33

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 est d'utiliser une fenêtre de surveillance (Debug / Windows / Watch). Ajouter une montre =

m4x4,16

Cela affiche les données dans une liste:

entrez la description de l'image ici

Une autre méthode consiste à utiliser une fenêtre Mémoire (Debug / Windows / Memory). Spécifiez une adresse de démarrage de la mémoire =

m4x4

Cela affiche les données dans un tableau, ce qui est mieux pour les matrices à deux et trois dimensions:

entrez la description de l'image ici

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 entiers, aux flottants et à certains encodages de texte.


21

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


10

une nouvelle visite:

supposons que vous ayez un pointeur ci-dessous:

double ** a; // assume 5*10

alors vous pouvez écrire ci-dessous dans la montre de débogage de Visual Studio:

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

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

double[5][10] a;

5

Pour,

int **a; //row x col

ajouter ceci pour regarder

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

S'il vous plaît, dites-moi, je ne trouve pas "montre". Où est-ce?
Egor Randomize le

4

Encore une autre façon de faire cela 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.


1
À partir du lien MSDN que vous avez donné - a,[10]vous permet de voir des éléments individuels afin qu'ils soient eux-mêmes extensibles, même si vous avez un CArray de types de données complexes.
LThode

1

Pour les baies 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 de surveillance

     pArray.m_pData,5 

pour voir les 5 premiers éléments.

Si pArray est un CArray à deux dimensions, vous pouvez examiner n'importe lequel des éléments de la deuxième dimension en utilisant la syntaxe suivante:

     pArray.m_pData[x].m_pData,y

1

Vous pouvez trouver une liste de nombreuses choses que vous pouvez faire avec des variables dans la fenêtre de surveillance de ce joyau dans la documentation: 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 pour le format et la 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)

0

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

Pour un tableau nommé current, qui a un tableau nommé Attribs à l'intérieur, qui contient un tableau nommé Attrib à l'intérieur, cela 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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.