2

このスレッドに続いて、関連する問題を共有したいと思います: totalview で 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 で、スタック フレームから array2D をダイブすると、変数ウィンドウがポップアップし、次のように表示されます。

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

次の手順は、上記のスレッドで Chris Gottbrath が言及したものと似ていますが、Type をいつ、どのように正確にキャストする必要があるかという点で少し複雑になります。そう、

ステップ 1 : マウスの中ボタンをクリックするか、値をダブルクリックして、ポインターの値に飛び込んでポインターを逆参照します。

これを行うと、次のようになります。

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

ステップ 2 : タイプを 1 レベルキャストします。「タイプ」チャンネルで、 int * をに変更します

int *[5]

次に、Enter キーを押します。このようにして、デバッガーは、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 : array2D[2][0] から array2D[0][4] までの整数をチェックするために、要素 [2] に飛び込みたいとしましょう。パネルでその行を中クリックすると、次のように表示されます。

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 : 2 番目のレベルでタイプをキャストします。「タイプ」チャンネルで、に変更します

int [5]

次に、Enter キーを押します。では、要素 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 アレイ ダイビングは慎重なダイビングとキャスティングの順序が必要なようです。他の方法を試しましたが、うまくいきませんでした。ですから、これが同じ問題に遭遇した人に役立つことを願っています.

4

1 に答える 1