使用两个动态数组帮助Visual Studio调试器可视化工具

时间:2011-07-05 19:53:34

标签: c++ visual-studio debugging

我正在尝试修改autoexp.dat以编写可视化工具,而我只是部分实现了我想要的。我有一个类(下面),其中Bar1和Bar2是动态分配的数组

class Foo
{
   double* Bar1;
   double* Bar2;
   int size;
}

和我提出的autoexp.dat的[Visualizer]部分中的可视化工具看起来像

Foo{
    children
    (
        #(
            [size]: [$c.size],

            #(
                    [Bar1]: #array(expr: $c.Bar1[$i], size: $c.size)
             ),
            #(
                    [Bar2]: #array(expr: $c.Bar2[$i], size: $c.size)
            )
        )
    )
}

不幸的是,这个的输出是

Foo
    [size] 24
    [Bar1] 1
    [Bar1] 1
    .
    .
    [Bar1] 1
    [Bar2] 0
    [Bar2] 0
    .
    .
    [Bar2] 0

我希望它显示

Foo
    [size] 24
    [Bar1]
         [0] 1
         [1] 1
          .
          .
         [23] 1
    [Bar2]
         [0] 0
         [1] 0
          .
          .
         [23] 0

其中Bar1和Bar2是可折叠的,但更重要的是我有索引。

2 个答案:

答案 0 :(得分:2)

扩展@IronMensan的建议,您可以使用switch语句来绕过动态大小限制,可能使用合适的长度作为默认值以避免开关变得太长...

Foo{
    children(
        #(
            #([size]: [$c.size]),
            #(
                #switch ($c.size)
                #case  0 (  #(Bar1: [$c.Bar1,  0])  )
                #case  1 (  #(Bar1: [$c.Bar1,  1])  )
                #case  2 (  #(Bar1: [$c.Bar1,  2])  )
                #case  3 (  #(Bar1: [$c.Bar1,  3])  )
                #case  4 (  #(Bar1: [$c.Bar1,  4])  )
                #case  5 (  #(Bar1: [$c.Bar1,  5])  )

                #default (  #(Bar1: [$c.Bar1, 50])  )
            ),
            #(
                #switch ($c.size)
                #case  0 (  #(Bar2: [$c.Bar2,  0])  )
                #case  1 (  #(Bar2: [$c.Bar2,  1])  )
                #case  2 (  #(Bar2: [$c.Bar2,  2])  )
                #case  3 (  #(Bar2: [$c.Bar2,  3])  )
                #case  4 (  #(Bar2: [$c.Bar2,  4])  )
                #case  5 (  #(Bar2: [$c.Bar2,  5])  )

                #default (  #(Bar2: [$c.Bar2, 50])  )
            )
        )
    )
}

答案 1 :(得分:1)

我知道如何让Bar1和Bar2折叠的唯一方法是不允许你使用动态尺寸:

Foo{
    children
    (
        #(
            [size]: [$c.size],
            [Bar1]: [$c.Bar1,30],
            [Bar2]: [$c.Bar2,30]
        )
    )
}

你可以用这样的多维数组做一些事情:

Foo {
    children
    (
        #(
            [size]: [$c.size],

            #array(expr: (0==$i/$c.size)*$c.Bar1[$i]+(1==$i/$c.size)*$c.Bar2[$i-$c.size], rank: 2, size: ($r==1)*$c.size+($r==0)*2)
        )
    )
}

这会将成员列为:

[0,0](Bar1 [0]的值)
[0,1](Bar1 [1]的值)
...
[0,N](Bar1 [N]的值)
[1,0](Bar2 [0]的值)
......

另一种方法是:

Foo {
    children
    (
        #(
            [size]: [$c.size],

            #array(expr: (0==$i%2)*$c.Bar1[$i/2]+(1==$i%2)*$c.Bar2[$i/2], rank: 2, size: ($r==0)*$c.size+($r==1)*2)
        )
    )
}

这将交错这样的值:

[0,0](Bar1 [0]的值)
[1,0](Bar2 [0]的值)
[0,1](Bar1 [1]的值)
[1,1](Bar2 [1]的值)
...