开发者

Help with Visual Studio debugger visualizer with two dynamic arrays

I'm trying to modify autoexp.dat to write a visualizer and I'm only partly achieving what I want. I have a class (below) where Bar1 and Bar2 are dynamically allocated arrays

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

and the visualizer in the [Visualizer] section of autoexp.dat that I've come up with looks like

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

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

Unfortunately, the output for this is

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

I would like it to show

Foo
    [size] 24
    [Bar1]
         [0] 1
         [1] 1
          .
          .
开发者_如何学编程         [23] 1
    [Bar2]
         [0] 0
         [1] 0
          .
          .
         [23] 0

where Bar1 and Bar2 are collapsible, but more importantly I have the indices.


Extending the suggestion from @IronMensan, you could use a switch statement to get around the dynamic size limitation, perhaps using a suitable length as the default to avoid the switch getting too long...

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])  )
            )
        )
    )
}


The only way I know how to make Bar1 and Bar2 collapsable won't allow you to use a dynamic size:

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

You could do something with multi-demensional arrays like this:

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)
        )
    )
}

This will list the members as:

[0,0] (value of Bar1[0])
[0,1] (value of Bar1[1])
...
[0,N] (value of Bar1[N])
[1,0] (value of Bar2[0])
...

Another way is to do this:

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)
        )
    )
}

This will interleave the values like this:

[0,0] (value of Bar1[0])
[1,0] (value of Bar2[0])
[0,1] (value of Bar1[1])
[1,1] (value of Bar2[1])
...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜