動的配列のデバッグ方法がやっと分かった.

62000 ワード

昨日、ある同級生と動的割り当ての配列デバッグについて議論しました.
動的割り当て配列の最も直接的で最も原始的な方法は、メモリ空間を動的に割り当てるポインタを使用することです.次のコードです.
//        2,  2 2   ,      1,2,3,4
int rows, cols;
//       2
rows = cols = 2;
//     
int **a;

//  malloc    
a = (int **)malloc(rows * sizeof(int *));
if(a == NULL)
    return 1;

for(int i = 0; i < rows; i++)
{
    a[i] = (int *)malloc(cols * sizeof(int));
    if(a[i] == NULL)
        return 1;
}

//    
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;

 
デバッガの場合、ターゲットオブジェクトaはコンパイラが長さを知ることができる静的配列ではなく、一連のポインタであるため、デバッグ時には配列のすべてのメンバーを表示することができず、ポインタとしてのみ、その指向する内容を表示し、aはポインタを指すポインタであるため、aが指向する空間はポインタである.Visual Studioは再びこのポインタが最終的に指す数字1も表示されます.最初のデバッグウィンドウのローカルデータのaは、次のようになります.
 
解決策は、変数をリスニングウィンドウに追加し、リスニングウィンドウに動的デバッグ式を追加してaの内容をプレビューすることです.
 
次に、リスニングウィンドウで、元のaをa,2(aカンマ2)に変更します.これはVisual Studioに伝えます.aを起点とした2つの要素の内容を見てみましょう(デバッグではプラス記号を使ってこの起点の位置を変更することもできます):
 その後、車に戻ります.
 
このとき,aが指す2つのポインタ,すなわち配列の2つの行のヘッダポインタ(それぞれ1と3を指し,リスニングウィンドウから見ることができる)が表示される.
しかし、配列全体のすべてのメンバーがまだ表示されていない場合は、この2つのヘッダポインタを再度リスナーに追加し、上の[0]と[1]を選択し、右クリックしてリスナーを追加する必要があります.
Watch 1ウィンドウには3つのデータがあります.
 
配列列数が2であるため、2つの配列の行ヘッダーポインタの後にカンマ2を追加して、空間の2つの要素の値を表示します.最後に、配列全体のメンバーが出てきます.
 
ここでもう1つのテクニックは、最初にaをリスニングウィンドウに追加すると、インタフェースはこのようになります(このとき、インタフェースはLocalsからWatch 1に移動します):
 WatchはLocalsとは異なり、式の値を変更することができます.もちろん、任意の複数の式を追加することもできます.上図の青い選択ボックスを見ると、Localsにはありません.デバッグ式を追加するために1行多く出ています.
 
この場合、aのデータを式でリスニングすることもできます.
*a,2と*(a+1)の順に入力すると、2の結果が出ます.
 
このように動的に配列を割り当てるのは、書くのが不便であるだけでなく、デバッグするのも不便である(後でメンテナンスするのも不便である)、1つはvectorのように動的配列と生のC++標準ライブラリに特化した内部データ構造を推奨することである.デバッグも便利です.
次のコードでvectorで上記の2 D配列を宣言します.
//+ #include 

//        2,  2 2 vector,      1,2,3,4
int rows, cols;
//       2
rows = cols = 2;

vector<vector<int>> a;

//    
a.resize(rows);
for(int i = 0; i < rows; i++)
    a[i].resize(cols);

//    
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;

 
その後、デバッグが非常に便利で、別の手足を必要とせず、データが一目瞭然です.
 
昨日、ある同級生と動的割り当ての配列デバッグについて議論しました.
動的割り当て配列の最も直接的で最も原始的な方法は、メモリ空間を動的に割り当てるポインタを使用することです.次のコードです.
//        2,  2 2   ,      1,2,3,4
int rows, cols;
//       2
rows = cols = 2;
//     
int **a;

//  malloc    
a = (int **)malloc(rows * sizeof(int *));
if(a == NULL)
    return 1;

for(int i = 0; i < rows; i++)
{
    a[i] = (int *)malloc(cols * sizeof(int));
    if(a[i] == NULL)
        return 1;
}

//    
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;

 
デバッガの場合、ターゲットオブジェクトaはコンパイラが長さを知ることができる静的配列ではなく、一連のポインタであるため、デバッグ時には配列のすべてのメンバーを表示することができず、ポインタとしてのみ、その指向する内容を表示し、aはポインタを指すポインタであるため、aが指向する空間はポインタである.Visual Studioは再びこのポインタが最終的に指す数字1も表示されます.最初のデバッグウィンドウのローカルデータのaは、次のようになります.
 
解決策は、変数をリスニングウィンドウに追加し、リスニングウィンドウに動的デバッグ式を追加してaの内容をプレビューすることです.
 
次に、リスニングウィンドウで、元のaをa,2(aカンマ2)に変更します.これはVisual Studioに伝えます.aを起点とした2つの要素の内容を見てみましょう(デバッグではプラス記号を使ってこの起点の位置を変更することもできます):
 その後、車に戻ります.
 
このとき,aが指す2つのポインタ,すなわち配列の2つの行のヘッダポインタ(それぞれ1と3を指し,リスニングウィンドウから見ることができる)が表示される.
しかし、配列全体のすべてのメンバーがまだ表示されていない場合は、この2つのヘッダポインタを再度リスナーに追加し、上の[0]と[1]を選択し、右クリックしてリスナーを追加する必要があります.
Watch 1ウィンドウには3つのデータがあります.
 
配列列数が2であるため、2つの配列の行ヘッダーポインタの後にカンマ2を追加して、空間の2つの要素の値を表示します.最後に、配列全体のメンバーが出てきます.
 
ここでもう1つのテクニックは、最初にaをリスニングウィンドウに追加すると、インタフェースはこのようになります(このとき、インタフェースはLocalsからWatch 1に移動します):
 WatchはLocalsとは異なり、式の値を変更することができます.もちろん、任意の複数の式を追加することもできます.上図の青い選択ボックスを見ると、Localsにはありません.デバッグ式を追加するために1行多く出ています.
 
この場合、aのデータを式でリスニングすることもできます.
*a,2と*(a+1)の順に入力すると、2の結果が出ます.
 
このように動的に配列を割り当てるのは、書くのが不便であるだけでなく、デバッグするのも不便である(後でメンテナンスするのも不便である)、1つはvectorのように動的配列と生のC++標準ライブラリに特化した内部データ構造を推奨することである.デバッグも便利です.
次のコードでvectorで上記の2 D配列を宣言します.
//+ #include 

//        2,  2 2 vector,      1,2,3,4
int rows, cols;
//       2
rows = cols = 2;

vector<vector<int>> a;

//    
a.resize(rows);
for(int i = 0; i < rows; i++)
    a[i].resize(cols);

//    
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;

 
その後、デバッグが非常に便利で、別の手足を必要とせず、データが一目瞭然です.
 
転入先http://www.mgenware.com/blog/?p=252