我正在使用C ++,code :: blocks(启用了警告,我检查确认)和SFML。
我试过自己狩猎这个小虫,但我真的找不到什么是错的。我知道段错是什么意思,但这个真的让我难过。我可以添加初学者,但我很快就会学习。我有一个基本的主要类void Engine
,它有一个方法void RenderFrame
,可以渲染应用程序的每一帧。在所述方法中,我有这个代码,它应该将所有的tile绘制到renderwindow上:
Tile* tile;
for (short y = 0; y < mapHeight; ++y) {
for (short x = 0; x < mapWidth; ++x) {
tile = currentLevel -> GetTile(x, y);
if (tile) {
tile -> Draw((x * tileSize), (y * tileSize), Wnd);
}
}
}
GetTile方法应该从std::vector<std::vector<Tile *> >
Draw方法只能这样做:
void Tile::Draw(int x, int y, sf::RenderWindow *pWnd) {
sprite.SetPosition(x, y);
pWnd -> Draw(sprite);
}
应用程序编译得很好,但在调用sprite.SetPosition(x, y);
这是调试器的完整调用堆栈:
#0 68701829 sf::Drawable::SetPosition(float, float) () (D:\Coding\C++\sfml\bin\debug\sfml-graphics.dll:??)
#1 004021F9 Tile::Draw(this=0x76ab8cd5, x=0, y=0, pWnd=0x3e3310) (D:\Coding\C++\sfml\include\Tile.cpp:12)
#2 00401D7E Engine::RenderFrame(this=0x3e3298) (D:\Coding\C++\sfml\include\Engine.cpp:106)
#3 00401B29 Engine::MainLoop(this=0x3e3298) (D:\Coding\C++\sfml\include\Engine.cpp:63)
#4 00401E27 _fu0___ZTIPKc(this=0x3e3298) (D:\Coding\C++\sfml\include\Engine.cpp:119)
#5 004022D6 main() (D:\Coding\C++\sfml\Main.cpp:8)
我希望这是足够的信息,并提前感谢。
编辑:哦,这是来自调试器输出。 Program received signal SIGSEGV, Segmentation fault.
In sf::Drawable::SetPosition(float, float) ()
没有提供有关该问题的更多信息。
答案 0 :(得分:2)
回溯中的这一行看起来很可疑:
#1 004021F9 Tile::Draw(this=0x76ab8cd5, x=0, y=0, pWnd=0x3e3310)
这似乎对应于你的Tile :: Draw函数,除了this
指针未对齐,这表明它不是一个有效的指针。所以也许你的std::vector<std::vector<Tile *> >
已经被破坏了。
答案 1 :(得分:0)
最可能的解释是currentLevel->GetTile(x,y)
返回的指针无效。这可能是因为它未正确初始化(对NUL或有效的已分配对象)或因为它所引用的对象已被销毁。两者都会解释sprite
不是有效对象,并且在该对象上调用SetPosition
将传递一个无效的this
指针,该指针将触发SIGSEGV。
答案 2 :(得分:0)
分段错误的一般原因是取消引用空指针或无效指针
1.检查GetTile(),这是否导致故障?
2.在解除引用之前检查currentLevel
。