Pregunta

si tengo un std::vector o std::map variable y quiero ver el contenido, es una gran molestia ver el enésimo elemento durante la depuración.¿Existe algún complemento o algún truco para facilitar la observación de las variables del contenedor STL durante la depuración? (VS2003/2005/2008)?

¿Fue útil?

Solución

Para vectores, esto hilo en los foros de msdn tiene un fragmento de código para configurar una vigilancia en un índice vectorial que podría ayudar.

Otros consejos

Si desea ver más de un elemento al mismo tiempo, puede agregar una coma y el número de elementos de la siguiente manera:

(v._Myfirst)[startIndex], count

Sin embargo, tenga en cuenta que el recuento debe ser una constante y no puede ser el resultado de otra expresión.

En VS2005 y VS 2008 puedes ver el contenido de los contenedores STL.Las reglas para acceder a los datos se encuentran en autoexp.dat "c:\Program Files\Microsoft Visual Studio 9\Common7\Packages\Debugger\autoexp.dat".

AutoExp.dat está diseñado para personalizarse.Sin embargo, las definiciones de STL se encuentran en una sección llamada [Visualizador].Si puedes descifrar el lenguaje utilizado en esa sección, tendrás más poder; sin embargo, te recomiendo que dejes esa parte como está.

Autoexp.dat existía en VS2003, pero no había soporte para contenedores STL ([Visualizer] no existía).En VS2003 tienes que navegar manualmente por la representación de datos subyacente.

Al modificar autoexp.dat, es posible agregar reglas para navegar por la representación de datos de sus propios tipos para que sean más fáciles de depurar.Si haces esto, solo debes agregar cosas en [AutoExp].Tenga cuidado y mantenga una copia de seguridad de este archivo antes de modificarlo.

Para ver el enésimo elemento de un contenedor en el depurador de Visual Studio, use:

container.operator[](n)

Puede crear un visualizador personalizado, consulte esto: http://www.virtualdub.org/blog/pivot/entry.php?id=120

El método más simple es preparar un puntero para observar variables como esta.

vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".

Probé "a._Myfirst[0]" en VisualStudio2015, pero no se mostraban datos de matriz.

Si puedes usar "natvis", resolverá tus problemas.

Este es "sample.natvis" para mostrar datos std::vector para Visual Studio 2015.

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="std::vector&lt;*&gt;">
    <DisplayString>{{ size={_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst} }}</DisplayString>
    <Expand>
      <Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Item>
      <Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst</Item>
      <ArrayItems>
        <Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
        <ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>

Antes enter image description here

Después enter image description here

Visual Studio 2008, al menos para mí, muestra el contenido de los contenedores STL en el cuadro de contenido estándar al pasar el mouse.

También puede hacer clic derecho en cualquier valor de su reloj y elegir "agregar reloj".Esto puede resultar útil si solo necesita mirar un elemento de un mapa o conjunto.

También conduce a la solución que christopher_f publicó para los vectores - ((v)._Myfirst)[index]

Método discutido anteriormente [((v)._Miprimero)[índice]] funcionará solo para un contenedor específico (std::vector), no para todos los contenedores STL posibles.Por ejemplo, si desea ver el contenido de std::deque, debe buscar algún otro método para explorar el contenido en std::deque.

Quizás puedas probar la siguiente configuración similar para resolver tu problema

[Probé esta configuración solo para la versión Visual Studio 2010 Professional instalada con Microsoft Visual Studio 2010 Service Pack 1]

Paso 1:Desinstale el Service Pack 1 de Microsoft Visual Studio 2010: para el trabajo de mi proyecto, realmente no necesito el Service Pack 1, por lo que desinstalar el Service Pack 1 no causará ningún problema en mi caso.

Paso 2:Reinicie su sistema.

Paso 3:Este paso no es necesario si no recibe el error 'LINK:error grave LNK1123:Fallo durante la conversión a COFF:archivo no válido o corrupto'.De lo contrario, navegue por

Propiedad del proyecto -> Vinculador (General) -> Cambiar Habilitar vinculación incremental a No (/INCREMENTAL:NO)

En vs 2015, no pude hacer funcionar ninguno de estos.
Entonces, escribí un poco de código.

1:Yo tenía vector de vector de elementos largos y largos

std::vector<std::string> vs(M_coins + 1);
for (unsigned long long i = 0; i <= M_coins; i++) {
    std::for_each(memo[i].begin(), memo[i].end(), [i, &vs](long long &n) {
        vs[i].append(std::to_string(n));
        });
}
// now vs is ready for use as vs[0], vs[1].. so on, for your debugger

Básicamente, lo que hice fue convertir el vector en una cadena.Tenía un vector de vector, así que tenía un vector de cadena para llenar.

2:si acabas de un vector de elementos largos y largos, luego simplemente convierta como se muestra a continuación:

std::vector<std::string> s;
std::for_each(v1.begin(), v1.end(), [&s](long long &n) {
    s.append(std::to_string(n));
    });
// now s is ready for use, for your debugger

Espero que haya ayudado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top