Wie zeige ich ein dynamisch zugewiesenes Array im Visual Studio-Debugger an?


144

Wenn Sie ein statisch zugewiesenes Array haben, kann der Visual Studio-Debugger problemlos alle Array-Elemente anzeigen. Wenn Sie jedoch ein Array dynamisch zugewiesen haben und auf das ein Zeiger zeigt, wird das erste Element des Arrays nur angezeigt, wenn Sie auf das + klicken, um es zu erweitern. Gibt es eine einfache Möglichkeit, dem Debugger mitzuteilen, dass diese Daten als Array vom Typ Foo und Größe X angezeigt werden?

Antworten:


196

Ja einfach. sag du hast

char *a = new char[10];

Schreiben im Debugger:

a,10

würde Ihnen den Inhalt zeigen, als wäre es ein Array.


10
Das ist ein großartiger Trick, aber wenn Ihr Zeiger auf eine Reihe von Strukturen zeigt, habe ich festgestellt, dass die einzelnen Elemente, die im Überwachungsfenster mit "a, 10" erweitert wurden, selbst nicht erweiterbar sind. Das heißt, Sie können mit dieser Methode nicht in das dritte Element des Arrays graben. Ist das etwas, das überwunden werden kann?
SirPentor

@ SirPentor Ich habe das gleiche Problem. Haben Sie eine Lösung gefunden?
Becko

@ Becko - negativ. Es ist frustrierend.
SirPentor

Wow, es ist nutzlos für Strukturen, Sie können nur die Namen der Vars sehen, nicht Werte
Icebone1000

2
Für Anfänger: Wenn Sie "eine" Variable auswählen, mit der rechten Maustaste klicken und zur Überwachungsliste hinzufügen (inspizieren), wenn Sie die De-Debugger-Ansicht in der Liste der überwachten Werte öffnen (ich kann den Namen des Fensters momentan nicht finden), Sie Sie können auf "a" doppelklicken und es in "a, X" umbenennen, wobei X die Anzahl der Elemente ist. Sie sehen jetzt alle Werte.
Darkgaze

33

Es gibt zwei Methoden zum Anzeigen von Daten in einem 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
};

Eine Möglichkeit ist ein Überwachungsfenster (Debug / Windows / Watch). Watch hinzufügen =

m4x4,16

Dies zeigt Daten in einer Liste an:

Geben Sie hier die Bildbeschreibung ein

Ein anderer Weg ist mit einem Speicherfenster (Debug / Windows / Speicher). Geben Sie eine Speicherstartadresse an =

m4x4

Dadurch werden Daten in einer Tabelle angezeigt, was für zwei- und dreidimensionale Matrizen besser ist:

Geben Sie hier die Bildbeschreibung ein

Klicken Sie mit der rechten Maustaste auf das Speicherfenster, um festzulegen, wie die Binärdaten angezeigt werden. Die Auswahlmöglichkeiten beschränken sich auf Ganzzahlen, Gleitkommazahlen und einige Textcodierungen.


21

Fügen Sie in einem Überwachungsfenster ein Komma nach dem Namen des Arrays und der Anzahl der Elemente ein, die angezeigt werden sollen.


10

ein erneuter Besuch:

Nehmen wir an, Sie haben einen Zeiger unten:

double ** a; // assume 5*10

Dann können Sie unten in Visual Studio Debug Watch schreiben:

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

Dadurch wird es in ein Array wie unten umgewandelt, und Sie können alle Inhalte auf einmal anzeigen.

double[5][10] a;

5

Zum,

int **a; //row x col

füge dies hinzu, um es zu sehen

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

Bitte sag mir, ich kann "Uhr" nicht finden. Wo ist es?
Egor Randomize

4

Eine weitere Möglichkeit hierfür ist hier in MSDN angegeben .

Kurz gesagt, Sie können ein Zeichenarray als verschiedene Arten von Zeichenfolgen anzeigen. Wenn Sie ein Array deklariert haben als:

char *a = new char[10];

Sie können es als Unicode-Zeichenfolge im Überwachungsfenster wie folgt drucken:

a,su

In den Tabellen auf der MSDN-Seite finden Sie alle möglichen Konvertierungen, da es einige gibt. Viele verschiedene Zeichenfolgenvarianten, Varianten zum Drucken einzelner Elemente im Array usw.


1
Über den von Ihnen angegebenen MSDN-Link a,[10]können Sie einzelne Elemente anzeigen, sodass sie selbst erweiterbar sind, selbst wenn Sie über ein CArray komplexer Datentypen verfügen.
LThode


1

Eine Liste vieler Dinge, die Sie mit Variablen tun können, finden Sie im Überwachungsfenster in diesem Juwel in den Dokumenten: https://msdn.microsoft.com/en-us/library/75w45ekt.aspx

Für eine Variable a gibt es die Dinge, die bereits in anderen Antworten wie erwähnt wurden

a,10 
a,su 

Es gibt jedoch noch viele andere Spezifizierer für Format und Größe, z.

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

Ich habe keine Möglichkeit gefunden, dies mit einem mehrdimensionalen Array zu verwenden. Sie können jedoch zumindest (wenn Sie den Index Ihres gewünschten Eintrags kennen) eine Uhr zu einem bestimmten Wert hinzufügen. Verwenden Sie einfach den Indexoperator.

Für ein Array mit dem Namen current, in dem sich ein Array mit dem Namen Attribs befindet und in dem sich ein Array mit dem Namen Attrib befindet, sollte es so aussehen, wenn Sie Position 26 einnehmen müssen:

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

Sie können auch einen Offset verwenden

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

zeigt ne "nächste" 25 Elemente. (Ich verwende VS2008, dies zeigt maximal 25 Elemente).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.