繁体   English   中英

SDL2/C++ 文件 I/O 错误

[英]SDL2/C++ File I/O Error

我正在测试一个游戏机制,其中将有两个文件(一个名为“X.txt”,另一个名为“Y.txt”)来跟踪您的 X 和 Y 位置。 它的工作方式是每次调用播放器的更新(即移动)时,程序都会将坐标写入 X 和 Y 文件。 当您关闭程序并重新打开该文件时,您将从上次关闭程序时所在的 X 和 Y 坐标开始。 我有两个问题:

1) 每次运行程序时,我都会从默认坐标 (0, 0) 开始,即使我告诉程序从文件中读取。

2)当我关闭程序时,我收到一条错误消息:

'FNTSTWE.exe 中 0x576812A7 (msvcp120d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xFEEEFEEE。

顺便说一下,错误是可变的,它们总是完全不同,这只是我遇到的众多错误之一。

此外,有时它会将我带到不同的文件,例如“xlocale”或“output.c”。

我认为这两件事是相互关联的,如果我能解决它们,我就能让它们都工作。

这是代码: https : //www.dropbox.com/s/j56kb41q3bmmnby/Program_SDL2_IO_Error.zip?dl=0

只要看看代码,请告诉我我做错了什么。

为了重现我所说的错误,请使用这些文件创建一个 Visual Studio SDL2 项目并对其进行调试以了解我的意思。

请帮忙。

谢谢你。

  1. CReadWriter类的函数中,您将参数作为值传递,因此不会更改CPlayer::CPlayerCPlayer::CPlayer和 curY 的值(它们保持为 0)。
  2. CPlayer::~CPlayer (析构函数)中,您将Image_Surface设置为NULL ,然后尝试使用导致内存错误的SDL_FreeSurface将其SDL_FreeSurface

解决方案:

  1. 请参阅这篇文章,了解不同的参数传递方式之间的区别: 按引用传递与按值传递有什么区别?

您的读取方法必须类似于:

void ReadX(int* X); // pass a pointer to the variable, in which you want to store the read value
void ReadX(int& X); // pass a reference to the variable ....
  1. 更改析构函数中两个语句的顺序:首先释放图像表面,然后将变量设置为NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM