を参考にしながらvectorなどに置き換えてコードを書いてみました。
それで実行してみたのですが、イレテーターが不正?のようなアサートウィンドウが出ました。
無理してスマートポインタなどを組み込んで実行しているのでそのせいかもしれません・・・。
どこかおかしい点は見受けられるでしょうか?ご教授お願いします。
長くなるのでスポイラーで。
► スポイラーを表示
Debug Assertion Failed!
Program:
...10\Project\ConsoleApplitation1\Debug\ConsoleApplication1.exe
File: C:\Program Files (x86)\microsoft visual studio 10.0\vc\include\vector
Line: 238
Expression: vector iterators incompatible
For information on how your program can couse an assertion
failure, see the Visual C++ documentation on asserts.
#include <cstdio>
#include <cstdlib>
#include <time.h>
#include <vector>
#include <memory>
#define MAP_WIDTH 40
#define MAP_HEIGHT 30
#define MIN_ROOM 4
#define MAX_ROOM 6
#define MIN_RECT MIN_ROOM
#define MAX_RECT MAX_ROOM
// 乱数発生関数簡易化マクロ
#define Rand(MIN,MAX) rand()%MAX+MIN
int map_i[MAP_HEIGHT][MAP_WIDTH];
struct rect_s
{
int left,right,top,bottom;
rect_s(){}
rect_s(const rect_s &){}
~rect_s(){}
};// 区画情報構造体
std::vector<std::shared_ptr<rect_s>> rect_list;
// 区画追加
rect_s *rect_add(int top,int left,int bottom,int right)
{
rect_s* rect;
rect = new rect_s();
rect->top = top;
rect->left = left;
rect->bottom = bottom;
rect->right = right;
rect_list.push_back(std::make_shared<rect_s>());
return(rect);
}
// 区画分割
void rect_split(rect_s *rect_parent)
{
rect_s *rect_child;
int split_coord;
if( (rect_parent->right - rect_parent->left <= MIN_RECT * 2) ||
(rect_parent->bottom - rect_parent->top <= MIN_RECT * 2) )
{ return ; }
// 子区画にコピー
rect_child = rect_add(rect_parent->top, rect_parent->left,rect_parent->bottom,rect_parent->right);
// 横か縦か乱数で
if(Rand(0,2)==0)
{
split_coord = Rand(rect_parent->left + MIN_RECT, rect_parent->right - MIN_RECT);
rect_parent->right = split_coord;
rect_child->left = split_coord;
rect_split(rect_parent);
rect_split(rect_child);
return;
}
else
{
split_coord = Rand(rect_parent->top + MIN_RECT, rect_parent->bottom - MIN_RECT);
rect_parent->bottom = split_coord;
rect_child->top = split_coord;
rect_split(rect_parent);
rect_split(rect_child);
return;
}
}
// 描画
void map_print( void )
{
int i,j;
int k;
std::shared_ptr<rect_s> rect;
k=0;
for(auto it=rect_list.begin();it != rect_list.end();k++,it++)
{
// イテレーターから代入できなかったため一つずつ
rect->top = rect_list.at(k)->top;
rect->left = rect_list.at(k)->left;
rect->bottom = rect_list.at(k)->bottom;
rect->right = rect_list.at(k)->right;
for(i=rect->top, j=rect->left; i<=rect->bottom; i++){ map_i[i][j] = 1; }
for(i=rect->top, j=rect->right; i<=rect->bottom; i++){ map_i[i][j] = 1; }
for(i=rect->top, j=rect->left; j<=rect->right; j++){ map_i[i][j] = 1; }
for(i=rect->bottom, j=rect->left; j<=rect->right; j++){ map_i[i][j] = 1; }
}
for(j=0;j<MAP_HEIGHT;j++)
{
for(i=0;i<MAP_WIDTH;i++)
{
if(map_i[i][j]!=0){ printf("#"); }
else { printf("."); }
}
printf("\n");
}
}
int main(void)
{
int i,j;
for(j=0;j<MAP_HEIGHT;j++)
{
for(i=0;i<MAP_WIDTH;i++)
{
map_i[i][j] = 0;
}
}
rect_list.clear();
rect_split(rect_add(0,0,MAP_WIDTH-1,MAP_HEIGHT));
map_print();
return 0;
}