用C++实现SDL的分割故障,尝试Blit图像

用C++实现SDL的分割故障,尝试Blit图像,c++,sdl,C++,Sdl,好的,我这里有一个有趣的。我正在制作一个俄罗斯方块克隆,基本上是为了提高我的技能。我试图重构我的代码,让它以我想要的方式抽象出来。虽然它以前工作得很好,但现在我在任何图像都可以显示之前就出现了分割错误。我试过调试它,但没用 我已经发布了我的SVN项目工作副本 这只是一个小项目,一个比我知识渊博的人和一个好的调试器可能会很快找到答案。唯一的依赖是。感谢那个能告诉我我做错了什么的人 编辑:据我所知,我现在拥有的和以前拥有的在逻辑上是相同的,所以我不会认为我现在拥有的会导致分割错误。只需在工作副本上运

好的,我这里有一个有趣的。我正在制作一个俄罗斯方块克隆,基本上是为了提高我的技能。我试图重构我的代码,让它以我想要的方式抽象出来。虽然它以前工作得很好,但现在我在任何图像都可以显示之前就出现了分割错误。我试过调试它,但没用

我已经发布了我的SVN项目工作副本

这只是一个小项目,一个比我知识渊博的人和一个好的调试器可能会很快找到答案。唯一的依赖是。感谢那个能告诉我我做错了什么的人


编辑:据我所知,我现在拥有的和以前拥有的在逻辑上是相同的,所以我不会认为我现在拥有的会导致分割错误。只需在工作副本上运行svn恢复,重新编译,您就可以看到它正在工作…

我的机器上没有安装SDL,但在查看代码之后

我在Output.cpp文件中注意到:

display = new Surface();
你什么也不做。此的构造函数为空。曲面未初始化

然后在Output::initalize中执行以下操作:

display->surface = SDL_SetVideoMode( 800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF );

看起来问题表面::表面从未实际初始化。如果您还没有找到解决方案,我回家后会深入研究。

我的机器上没有安装SDL,但在查看代码之后

我在Output.cpp文件中注意到:

display = new Surface();
你什么也不做。此的构造函数为空。曲面未初始化

然后在Output::initalize中执行以下操作:

display->surface = SDL_SetVideoMode( 800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF );

看起来问题表面::表面从未实际初始化。如果您还没有找到解决方案,我回家后会深入研究。

查看Surface.cpp的第15到18行:

    surface = SDL_DisplayFormatAlpha( tempSurface );
    surface = tempSurface;
}
SDL_FreeSurface( tempSurface );
我认为这是错误的,因为当您稍后使用此曲面时,您实际上是在tempSurface上操作的,因为这条线:

surface = tempSurface;

而不是SDL_DisplayFormatAlpha返回的曲面。由于释放了tempSurface,surface现在指向无效内存。要修复,只需删除else块中的第二行。

查看Surface.cpp的第15到18行:

    surface = SDL_DisplayFormatAlpha( tempSurface );
    surface = tempSurface;
}
SDL_FreeSurface( tempSurface );
我认为这是错误的,因为当您稍后使用此曲面时,您实际上是在tempSurface上操作的,因为这条线:

surface = tempSurface;

而不是SDL_DisplayFormatAlpha返回的曲面。由于释放了tempSurface,surface现在指向无效内存。要解决此问题,只需删除else块中的第二行。

据我所知,当您试图操作不再可用的ponter时,或者您试图更改常量值时,会发生分段错误。

据我所知,分段错误发生在您尝试操作不再可用的端口或尝试更改常量值时。

您可能应该从核心文件或在调试器中运行堆栈跟踪。不幸的是,工作副本的原始链接不可用我的母校很酷,显然是这样的。我会看看是否能在我的一个旧硬盘上找到代码的副本,并设置一个更永久的链接。你可能应该发布一个堆栈跟踪,从核心文件或在调试器中运行它。不幸的是,到工作副本的原始链接不可用。我的母校很酷,显然删除了类似的tarball。我会看看是否能在我的一个旧硬盘上找到代码副本,并建立一个更永久的链接。那应该没问题,因为SDL_SetVideoMode。。。将创建并初始化屏幕表面,然后将指针传递回display->surface。这应该可以,因为SDL_SetVideoMode。。。将创建并初始化屏幕表面,然后将指针传递回display->surfacedoh!我觉得这很简单。。。下一个问题是:到底是什么让我这么做等等,我现在想起来了,我是想彻底摆脱SDL_,看看这是不是问题所在。然后当我把SDL_DisplayFormatAlpha放回去的时候,我忘了把那条线去掉!我觉得这很简单。。。下一个问题是:到底是什么让我这么做等等,我现在想起来了,我是想彻底摆脱SDL_,看看这是不是问题所在。然后当我把SDL_DisplayFormatAlpha放回去的时候,我忘了把那条线去掉。