在此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阵列潜水似乎需要仔细的潜水和投射顺序。我尝试了其他方法,但他们没有正常工作。所以,我希望这对遇到同样问题的人有用。
答案 0 :(得分:1)
已经四年了,但我发现自己处于这种状况,并找到了这个问题的答案。大部分答案都在this knowledge base page上找到。
如何在totalview中正确显示2D动态数组:
潜入array2D
。 Totalview会将表达式显示为*(array2D)
,类型显示为TYPE *
。在您的情况下,TYPE
为int
。
将类型条目更改为TYPE [B]*[A]
,或等效TYPE ([A]*)[B]
,其中您有一个大小为A
x B
的数组。在您的情况下,这将是int [5]*[5]
。要明确数组的有效范围应为[0][0]
到[A-1][B-1]
。
右键单击并选择Dive into all。这会将表达式更改为(((TYPE[B]*[A])&*(array2D)))[:]
,类型为TYPE[A][B]
。完整数组现在将显示在Totalview中。