C++ 向量映射,坏访问器

C++ 向量映射,坏访问器,c++,vector,map,exc-bad-access,tiling,C++,Vector,Map,Exc Bad Access,Tiling,我正在和几个朋友一起玩一个地下城游戏,并且正在寻找路径。游戏是基于分片的,我们计划实施的寻路是: 类PathMapper生成每个磁贴到给定磁贴的距离网格 职业怪物使用此网格向给定的瓷砖移动(现在,始终是玩家) 我们计划有4名玩家,但我们/我希望脚本支持动态数字。每个玩家都有一个整数形式的ID 每个玩家都需要一个由PathMapper生成的网格,所有怪物都可以共享它们(生成网格的速度很慢,对于所有怪物来说,每个玩家只生成一次网格似乎是一个不错的寻路解决方案) 我有一个名为“PathMapper”的

我正在和几个朋友一起玩一个地下城游戏,并且正在寻找路径。游戏是基于分片的,我们计划实施的寻路是:

类PathMapper生成每个磁贴到给定磁贴的距离网格

职业怪物使用此网格向给定的瓷砖移动(现在,始终是玩家)

我们计划有4名玩家,但我们/我希望脚本支持动态数字。每个玩家都有一个整数形式的ID

每个玩家都需要一个由PathMapper生成的网格,所有怪物都可以共享它们(生成网格的速度很慢,对于所有怪物来说,每个玩家只生成一次网格似乎是一个不错的寻路解决方案)

我有一个名为“PathMapper”的类,该类生成瓷砖和起始瓷砖之间距离的网格。理论上,将创建其中的4个,每个玩家一个。要让敌人找到玩家的路径,它会要求玩家的ID,然后要求相应的瓷砖网格,它将使用该网格进行路径查找。服务器使用“createMap(playerID、playerXPosition、PlayerPosition)”更新这些网格

因此,每个网格都是一个向量向量,映射到私有地图“pathMap”中玩家的ID,怪物可以通过“getLocalPath()”访问这些值

问题是,尽管“createMap”编译得很好,但一旦尝试复制第一面墙(“pathMap[ID][x].push_back(9000);”),我就会得到“EXE_BAD_ACCESS”。我应该注意到,在尝试(但失败)插入“9000”之前,它经过了十几次迭代。我确信dungeon->width和dungeon->height是正确的(现在都是20;对于真正的游戏可能是~100),ID的“正确性”不应该影响代码的访问者,对吗

我有点困惑,b/c我想我正在做的是保留空间,循环通过它,并尝试访问我刚刚保留的内存:

reserve(20)
for(i=0; i<20; i++)
    reserve(20)
    for(j=0; j<20; j++)
        access(i,j) // error!?
reserve(20)
对于(i=0;i路径图;
}
路径映射器::路径映射器(地牢*d){
地牢=d;
wallBitmap=dungeon->getWalls();//布尔告诉你瓷砖上是否有墙
}
void PathMapper::createMap(int-ID,int-x,int-y){
路径地图[ID]。保留(地牢->宽度());
对于(int x=0;xwidth();x++){
路径映射[ID][x]=std::vector();
路径地图[ID][x]。保留(地下城->高度();
对于(int y=0;yheight();y++){
if(墙位图[x][y]){
路径映射[ID][x]。推回(9000);//此处有错误
}
否则{
路径图[ID][x][y]=-1;
}
}
}
//此处计算值的代码;不应影响上面的代码
}
不更改向量的大小(仅容量),您需要。

不更改向量的大小(仅容量),您需要。

不更改向量的大小(仅容量),您需要。

不更改向量的大小(仅容量),您需要。

也不更改向量的大小

使用
调整大小

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>();
pathMap[ID][x].resize(dungeon->height());
pathMap[ID]。调整大小(副本->宽度();
...
路径映射[ID][x]=std::vector();
路径图[ID][x]。调整大小(副本->高度();
或者直接在构造函数中传递大小:

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>(dungeon->height());
pathMap[ID]。调整大小(副本->宽度();
...
路径图[ID][x]=std::vector(地牢->高度());
或者

使用
调整大小

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>();
pathMap[ID][x].resize(dungeon->height());
pathMap[ID]。调整大小(副本->宽度();
...
路径映射[ID][x]=std::vector();
路径图[ID][x]。调整大小(副本->高度();
或者直接在构造函数中传递大小:

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>(dungeon->height());
pathMap[ID]。调整大小(副本->宽度();
...
路径图[ID][x]=std::vector(地牢->高度());
或者

使用
调整大小

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>();
pathMap[ID][x].resize(dungeon->height());
pathMap[ID]。调整大小(副本->宽度();
...
路径映射[ID][x]=std::vector();
路径图[ID][x]。调整大小(副本->高度();
或者直接在构造函数中传递大小:

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>(dungeon->height());
pathMap[ID]。调整大小(副本->宽度();
...
路径图[ID][x]=std::vector(地牢->高度());
或者

使用
调整大小

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>();
pathMap[ID][x].resize(dungeon->height());
pathMap[ID]。调整大小(副本->宽度();
...
路径映射[ID][x]=std::vector();
路径图[ID][x]。调整大小(副本->高度();
或者直接在构造函数中传递大小:

pathMap[ID].resize(dungeon->width());
...
pathMap[ID][x] = std::vector<int>(dungeon->height());
pathMap[ID]。调整大小(副本->宽度();
...
路径图[ID][x]=std::vector(地牢->高度());

这有点冗长。你能关注错误和导致错误的代码吗?这有点冗长。你能关注错误和导致错误的代码吗?这有点冗长。你能关注错误和导致错误的代码吗?这有点冗长。你能关注错误和导致错误的代码吗?有点尴尬对我来说。谢谢:)对我来说有点尴尬。谢谢:)对我来说有点尴尬。谢谢:)对我来说有点尴尬。谢谢:)