我正在使用C ++和SFML 2.0开展一个学校项目,它将于周二发布,而我最近才遇到这个问题。 我在最新的Call Stack的位置放了一个箭头。 这些是我怀疑它们可能有问题的代码部分。我也是c ++的新手,我知道我做了很多错事。
这是在我的Background
课程中,它会加载我的所有图块,设置它们的位置和图块类型等等。
GetWayPointList
会向我的EnemyManager
类
void Background::Load(QuadTree * quadTree) {
int tempTiles[32][32] = {... Lots of 1's and 0's in here };
for(int i = 0; i < 32; i++)
{
for(int j = 0; j < 32; j++)
{
---> tile[j][i]->tileType = tempTiles[j][i];
tile[j][i]->setPosition(sf::Vector2f((float)(i*32),(float)(j*32)));
if(tile[j][i]->tileType == 1)
{
quadTree->AddObject(tile[j][i]);
}
else if(tile[j][i]->tileType == 0)
{
tile[j][i]->distanceFromStart = INT_MAX;
tile[j][i]->parent = NULL;
vector<Tile*> tempTiles;
if(tile[j+1][i]->tileType == 0)
tempTiles.push_back(tile[j+1][i]);
if(tile[j-1][i]->tileType == 0)
tempTiles.push_back(tile[j-1][i]);
if(tile[j][i+1]->tileType == 0)
tempTiles.push_back(tile[j][i+1]);
if(tile[j][i-1]->tileType == 0)
tempTiles.push_back(tile[j][i-1]);
tile[j][i]->setSuccessors(tempTiles);
tilesList->push_back(tile[j][i]);
}
}
}
}
vector<Tile*>* Background::GetWayPointList()
{
return tilesList;
}
调用堆栈本身说TileShooter v0.1.exe!Background::Load(QuadTree*quadTree) Line 68 + 0x2e bytes
。
第68行是箭头所在的位置。
如果您需要更多代码/信息,请说明。 关于可能出错的任何一点都会受到极大的关注。 最诚挚的问候,Fredrik W
修改
我编辑了一些代码,包括tile[j][i] = new Tile();
void Background::Load(QuadTree * quadTree) {
int tempTiles[32][32] = {... Lots of 1's and 0's in here };
for(int i = 0; i < 32; i++)
{
for(int j = 0; j < 32; j++)
{
tile[j][i] = new Tile();
tile[j][i]->tileType = tempTiles[j][i];
tile[j][i]->setPosition(sf::Vector2f((float)(i*32),(float)(j*32)));
if(tile[j][i]->tileType == 1)
{
quadTree->AddObject(tile[j][i]);
}
else if(tile[j][i]->tileType == 0)
{
tile[j][i]->distanceFromStart = INT_MAX;
tile[j][i]->parent = NULL;
vector<Tile*> tempTiles;
----> if(tile[j+1][i]->tileType == 0)
tempTiles.push_back(tile[j+1][i]);
if(tile[j-1][i]->tileType == 0)
tempTiles.push_back(tile[j-1][i]);
if(tile[j][i+1]->tileType == 0)
tempTiles.push_back(tile[j][i+1]);
if(tile[j][i-1]->tileType == 0)
tempTiles.push_back(tile[j][i-1]);
tile[j][i]->setSuccessors(tempTiles);
tilesList->push_back(tile[j][i]);
}
}
}
}
vector<Tile*>* Background::GetWayPointList()
{
return tilesList;
}
这并没有真正解决,而是向下移动了错误,我已将我的箭头移动到Call Stack有最新呼叫的位置。
答案 0 :(得分:4)
因此,您的tile
成员定义为Tile* tile[32][32]
。这是一个大小为32x32的2D数组,其中每个元素都是指向Tile
的指针。但是,它们只是只是指针,并且当前没有特别指向任何地方 - 访问它们是未定义的行为(在您的情况下,是访问冲突)。您需要分配实际的Tile
对象:
for (int i = 0; i < 32; i++) {
for (int j = 0; j < 32; j++) {
tile[i][j] = new Tile();
}
}
不要忘记在Background
的析构函数中执行相同类型的循环,而不是delete tile[i][j];
。
更好的是,不要动态分配您的图块,只需将tile
定义为:
Tile tile[32][32];
更好(!),使用std::array<std::array<Tile,32>,32>
。 :)
要回答您的修改,即使上述回答无效:您正在访问j+1
的{{1}}元素。当tile
为31时,您正在访问超出阵列范围的j
。