访问冲突写入位置0x00000000.C++/SFML游戏
Access violation writing location 0x00000000. C++ / SFML game
我正在使用C++和SFML 2.0进行一个学校项目,它将于周二到期,我最近刚刚遇到了这个问题。我在最新的调用堆栈所在的位置放了一个箭头。这些是我怀疑其中可能有错误的代码部分。我对 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 行是箭头所在的位置。
如果您需要更多代码/信息,请说。任何关于可能出错的观点都会得到极大的赞赏。最好的问候,弗雷德里克·
编辑
我已经编辑了一些代码,包括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 的 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>
。 :)
要回答您的编辑,即使它无效,我的上述答案:您正在访问tile
的第j+1
个元素。当j
为 31 时,您正在访问数组边界之外的tile[32]
。
- 矢量下标超出SFML游戏中的范围
- 如何使用 SFML 在贪吃蛇游戏中定义游戏结束?
- SFML c ++ 当包含文件内游戏中发生事件时,如何使用铃声函数为我的游戏创建声音类?
- 游戏引擎 SFML C++错误
- 如何在主游戏循环中使用 sfml 只播放一次声音
- 如何在 SFML C++游戏中将资产加载与主循环分开
- 如何与他人共享我的 SFML 游戏而不会出错?
- SFML多个房间游戏设计,如何组织程序
- 使用碰撞检测来增加SFML 2.4中的游戏分数的问题
- SFML游戏C++中的瓷砖地图碰撞
- 哈勒2D Diagonal Movement的SFML游戏开发书
- 访问冲突写入位置0x00000000.C++/SFML游戏
- 如何将SFML游戏服务器部署到Linux服务器
- 第 4 个射击语句在 SFML 游戏中不起作用
- 为什么我的 SFML 游戏只能在终端中运行时使用
- 运行SFML游戏时出现奇怪错误
- C++ SFML游戏编程链接错误
- 如何在另一台计算机上玩SFML游戏
- SFML游戏减速射击子弹
- 如何定义在 SFML 游戏中使用多少 CPU