gpt4 book ai didi

c++ - 访问冲突写入位置 0x00000000。 C++/SFML游戏

转载 作者:行者123 更新时间:2023-11-30 02:01:56 25 4
gpt4 key购买 nike

我正在使用 C++ 和 SFML 2.0 进行一个学校项目,该项目将于星期二到期,我最近才遇到这个问题。我在最新的调用堆栈所在的位置放了一个箭头。这些是我怀疑可能有问题的代码部分。我对 C++ 也很陌生,我知道我做错了很多事情。

这是在我的 Background 类中,它加载我所有的图 block ,设置它们的位置和图 block 类型等等。

GetWayPointList 向我的 EnemyManager 类返回一个瓦片 vector

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 行是箭头所在的位置。

如果您需要更多代码/信息,请直接说。任何关于可能错误的观点都将得到极大的应用。最好的问候,弗雷德里克 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;
}

这并没有真正解决问题,而是将错误向下移动,我已将箭头移到调用堆栈的最新调用位置。

最佳答案

所以你的 tile成员定义为 Tile* tile[32][32] .这是一个大小为 32x32 的二维数组,其中每个元素都是指向 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 tile 的第一个元素.当j是 31,您正在访问 tile[32]这在你的数组范围之外。

关于c++ - 访问冲突写入位置 0x00000000。 C++/SFML游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com