2017-01-15 3 views
0

私は小さな迷路ジェネレータを作成してC++を学ぼうとしています。これを容易にするために、Cell()のリストをxとyの値とともにMaze()のベクトルの中に格納します(完全性のためにいくつかの他の情報が含まれていますが、ベクトルを反復すると同じオブジェクトが返される

セルはベクトルに格納され、セルのXとYの値が決定され、セルが作成されるごとに渡されます。

問題は、各セルに同じx値とy値が設定されているように見えることです。

vector<Cell*> Maze::cells; 
int Maze::width; 
int Maze::height; 

Maze::Maze(int w, int h) 
{ 
    /* Set width and height */ 
    width  = w; 
    height = h; 

    /* These variables keep track of our position in the maze as we generate it */ 
    int scan_w = 0; 
    int scan_h = 0; 

    /* Continue looping until we've visited all cells */ 
    /* Offset by one because the width starts at 1 while the scan is zero-based */ 
    for (int i = 0; i <= (width * height); i++) 
    { 
     cells.push_back(new Cell(scan_w,scan_h)); 

     cout << scan_w << "/" << scan_h << endl; 
     scan_w = (i % w); 
     if (scan_w == 0) 
     { 
      scan_h++; 
     } 
    } 


    for(int i = 0; i <= cells.size(); i++) 
    { 
     cout << "[" << cells[i]->x << ", " << cells[i]->y << "] " << &cells[i] << endl; 
    } 
} 

編集:ここではセルクラスの要部である

int   Cell::x; 
int   Cell::y; 

Cell::Cell(int location_x, int location_y) 
{ 
    x = location_x; 
    y = location_y; 
} 

このコード(簡潔にするために切り捨て)の出力である:

ここ

は、関連するコードであります

Maze maze = Maze(50, 25); 

0/0 
0/1 
1/1 
2/1 
3/1 
4/1 
5/1 
6/1 
7/1 
8/1 
9/1 
... 
40/25 
41/25 
42/25 
43/25 
44/25 
45/25 
46/25 
47/25 
48/25 
49/25 
[49, 25] 0x632f30 
[49, 25] 0x632f38 
[49, 25] 0x632f40 
[49, 25] 0x632f48 
[49, 25] 0x632f50 
[49, 25] 0x632f58 
[49, 25] 0x632f60 
[49, 25] 0x632f68 
... 

私の前提です:

  • 出力に基づいて、scan_wとscan_hが意図したとおりにインクリメントされています(左から右、上から下へテーブルを読み取った場合と同様)。
  • フロー制御のドキュメント/チュートリアルに基づいて、私の理解は、最初のforループがセルの1つの要素から次のものへ適切に移動していることです。
  • documentation for vector's push_back memberに基づいて、私は、新しく作成された各セルへの参照をベクターに適切に挿入していると仮定しています。
  • documentation for the [] operator for vectorsに基づいて、私はセル[0]とセル[1]にアクセスすると、私は別のオブジェクトにアクセスすることになります(これは上記のようにオブジェクトのアドレスを印刷することによって確認されます)。

私は、なぜ特定のセルがscan_wとscan_hとの位置合わせでインクリメントされるはずである場合、各セルのxとyの値がそれぞれ49と25であるのか理解できていません。

最後には、ここで私はと考え、物事のカップルです:

  • ザ・ループのためには、(オブジェクトのアドレスを印刷して反証)同じオブジェクトを読み込むことができます。
  • これは範囲の問題かもしれません。私はPythonに慣れているので、私の前提はスコープが同じように機能することですが、正確かどうかを知るにはC++に精通していません。
  • これは、ベクトルの操作方法と関係があります([]演算子のドキュメントによって多かれ少なかれ不具合が生じます)。
  • 出力が誤っている可能性があります。または、scan_インクリメントコードがバグかもしれません。これは最も可能性の高いシナリオですが、私はまだ何かを見つけることができませんでした。おそらく短い休憩と新鮮な目はここで何かを明らかにするかもしれない。
+0

Cellクラスのコードがありません。 – koalo

+0

他のものは別として、<=演算子は<演算子である必要があります。 –

+0

@koaloおっとり - 追加されました! – Exsomet

答えて

1

Cellクラスのコードの書式を考慮して、青でちょうどいいです。 xとyが静的に定義されている可能性があります(そうでなければ "int Cell:x;"どこにでも...)?それは、静的に定義されたメンバーの性質であるため、大文字小文字の区別がはっきりしています。解決策は、単にstaticキーワードを削除することです。

+0

これでした! 修正されたコードで質問を更新します。 – Exsomet

+0

@Exsometは答えを含む質問を更新しません。それは質問と回答形式の流れを混乱させます。 – user4581301

1

表示されているコードに複数のバグがあります。

for (int i = 0; i <= (width * height); i++) 

これは1回繰り返しすぎます。例えば、幅と高さの両方が10であり、場合、これはiが0包括100から、または101細胞の範囲に設定して反復し、代わりに100

の次の問題は、その計算でありますscan_wおよびscan_hは不必要に複雑です。これは、単純な数学を使用して、そしてまた同時に、反復バグを修正し、些細な計算する必要があります:

for (int i = 0; i < (width * height); i++) 
{ 
    int scan_w = i % width; 
    int scan_h = i/width; 
    cells.push_back(new Cell(scan_w,scan_h)); 
} 

別のバグはここにある:最初のバグとして

for(int i = 0; i <= cells.size(); i++) 

同じ問題。最後の反復では、icells.size()と等しくなり、cells[i]は存在しないため、動作が未定義になります。

ここでも、反復はに補正する必要があります

for(int i = 0; i < cells.size(); i++) 

その後、結果があなたの期待と一致した場合、またはその他の問題が残っているかどうかをチェックする、これらの問題を自分で固定することにより開始することができます。

+0

これを修正しました。おそらく、いくつかの基本についてブラッシュアップする必要があるようです。ありがとう! – Exsomet

関連する問題