如何在totalview中潜水动态2D阵列

时间:2012-06-12 21:02:05

标签: dynamic multidimensional-array totalview

在此thread之后我想分享一个相关的问题:如何在总视图中将int **作为2D数组潜水? (这里讨论解决方案)。如果有人遇到同样的问题,我希望这会有所帮助!

让我们说在我的代码中我有一个动态2D数组,如下所示

     int ** array2D = new int * [5];
     for (int i = 0; i < 5; i++) {
             array2D[i] = new int [5];
     }

     for (int i = 0; i < 5; i++) {
             for (int j = 0; j < 5; j++) {
                     array2D[i][j] = i + j;
             }
     }

现在,在TotalView中,当您从Stack Frame中下载array2D时,会弹出Variable Window并显示如下内容:

Expresion: array2D, Address: 0x7fffd50efbc8
Type: int **
Value: 0x02234660 -> 0x02234690 -> 0x00000000 (0)

以下步骤与我上面提到的thread中提到的Chris Gottbrath类似,但在何时以及如何准确地转换Type方面,它有点复杂。所以,

第1步:通过鼠标中键单击或双击值,潜入指针取消引用指针的值。

这样做会给你这样的事情:

Expresion: *(((int **)array2D)), Address: 0x02234660
Type: int *
Value: 0x02234690 -> 0x00000000 (0)

第2步:现在将类型转换为一级。在“类型”通道中,将int *更改为

int *[5]

然后按回车键。这样调试器就知道array2D是指向大小为5的指针列表的指针。请注意,我的动态数组是一个指向指针列表的指针。现在,上面显示的值将改为这样:

Field                 Value
[0]                   0x02234690 -> 0x00000000 (0)
[1]                   0x022346b0 -> 0x00000001 (1)
[2]                   0x022346d0 -> 0x00000002 (2)
[3]                   0x022346f0 -> 0x00000003 (3)
[4]                   0x02234710 -> 0x00000004 (4)

我们现在看到array2D有5个元素,它们是指向子列表的指针。现在,如果我们深入研究这些元素中的任何一个,我们就不会得到整数列表。为了看到整数,我们需要再次取消引用,对于我们进行的每次潜水。

第3步:假设我们想要在元素[2]中潜入以检查从array2D [2] [0]到array2D [0] [4]的整数。当我们在面板中点击该行时,我们会看到:

Expresion: (((int *[5])*(((int **)array2D))))[2], Address: 0x02234670
Type: int *
Value: 0x022346d0 -> 0x00000002 (2)

我们现在正在查看指向子列表编号2的指针,该子列表应该包含整数。

第4步:现在,再一次潜水取消引用,我们应该看到这样的事情:

Expresion: *(((int *)(((int *[5])*(((int **)array2D))))[2])), Address: 0x022346d0
Type: int
Value: 0x00000002 (2)

第5步:现在将类型转换为第二级。在“类型”通道中,将int更改为

int [5]

然后按回车键。我们去了:我们看到了元素array2D [2] [0] - array2D [2] [4]

Field                 Value
[0]                   0x00000002 (2)
[1]                   0x00000003 (3)
[2]                   0x00000004 (4)
[3]                   0x00000005 (5)
[4]                   0x00000006 (6)

虽然潜水1D阵列很简单,但2D阵列潜水似乎需要仔细的潜水和投射顺序。我尝试了其他方法,但他们没有正常工作。所以,我希望这对遇到同样问题的人有用。

1 个答案:

答案 0 :(得分:1)

已经四年了,但我发现自己处于这种状况,并找到了这个问题的答案。大部分答案都在this knowledge base page上找到。

如何在totalview中正确显示2D动态数组:

  1. 潜入array2D。 Totalview会将表达式显示为*(array2D),类型显示为TYPE *。在您的情况下,TYPEint

  2. 将类型条目更改为TYPE [B]*[A],或等效TYPE ([A]*)[B],其中您有一个大小为A x B的数组。在您的情况下,这将是int [5]*[5]。要明确数组的有效范围应为[0][0][A-1][B-1]

  3. 右键单击并选择Dive into all。这会将表达式更改为(((TYPE[B]*[A])&*(array2D)))[:],类型为TYPE[A][B]。完整数组现在将显示在Totalview中。