SDL2/ c++文件输入输出错误

SDL2/C++ File I/O Error

本文关键字:输入输出 错误 文件 c++ SDL2      更新时间:2023-10-16

我正在测试一个游戏机制,其中将有两个文件(一个名为'X.txt',另一个名为'Y.txt')记录你的X和Y位置。它的工作方式是,每次玩家的更新(例如移动)被调用时,程序将把坐标写入X和Y文件。当您关闭程序并重新打开该文件时,您将从上次关闭程序时所处的X和Y坐标开始。我有两个问题

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

2)当我关闭程序时,我得到一个错误说:

' FNTSTWE.exe中0x576812A7 (msvcp120 .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::CPlayer中的curX和curY的值(它们保持0)。
  2. CPlayer::~CPlayer(析构器)中,您将Image_Surface设置为NULL,然后尝试使用SDL_FreeSurface释放它,导致内存错误。

解决方案:

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

你的read方法必须是这样的:

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 ....
  • 改变析构函数中两个语句的顺序:先释放图像表面,然后将变量设置为NULL