C++ 丢失指针值
我每次运行程序都会得到相同的日志 main.cpp中有一个片段,其中每个变量都在本地范围内:C++ 丢失指针值,c++,pointers,sdl,C++,Pointers,Sdl,我每次运行程序都会得到相同的日志 main.cpp中有一个片段,其中每个变量都在本地范围内: EDIT: you find at the bottom. 我为启动游戏、运行菜单循环和关闭图形创建了这些函数,如果出现问题,则为gameNoError提供假值。但最后一个函数给出了以下日志消息: 没有要关闭的当前窗口或/和渲染器!SDL可能未启动、已关闭或使用了错误的指针 (注意,所有日志消息都是我自己写的,因为我想使用日志记录。) 这意味着我在某个地方丢失了指针的值,但我不知道为什么 还有我的关闭
EDIT: you find at the bottom.
我为启动游戏、运行菜单循环和关闭图形创建了这些函数,如果出现问题,则为gameNoError提供假值。但最后一个函数给出了以下日志消息:
没有要关闭的当前窗口或/和渲染器!SDL可能未启动、已关闭或使用了错误的指针
(注意,所有日志消息都是我自己写的,因为我想使用日志记录。)
这意味着我在某个地方丢失了指针的值,但我不知道为什么
还有我的关闭功能:
bool closeGraphics(FILE* logFile, SDL_Window* gameWindow, SDL_Renderer* gameRenderer)
{
bool success = false;
if (gameWindow == NULL or gameRenderer == NULL)
{
doLogging(logFile, "No present window or/and renderer to close! SDL possibly not started, closed already or wrong pointers used!");
success = false;
}
else
{
SDL_DestroyRenderer(gameRenderer);
gameRenderer = NULL;
SDL_DestroyWindow(gameWindow);
gameWindow = NULL;
doLogging(logFile, "Renderer and window destroyed successfully!");
}
TTF_Quit();
IMG_Quit();
SDL_Quit();
return success;
}
我只在菜单循环中使用指针进行渲染(如果您需要,我也会粘贴它!),指针在范围中使用
那么问题是什么呢
编辑:
我发现:菜单循环也松开了指针!但是SDL启动了,我不是第一个这样做的。所以我真的不知道问题出在哪里
我的项目中的文件:
main.cpp:
#include <stdio.h>
#include <string>
#include <SDL.h>
#include "initialization/utility.hpp"
#include "initialization/init_closeGraphics.hpp"
#include "menuLoop.hpp"
int main(int argc, char* argv[])
{
bool gameNoError = true;
SDL_Renderer* gameRenderer = NULL;
SDL_Window* gameWindow = NULL;
FILE* logFile = fopen("errorLog.txt", "w");
doLogging(logFile, "Game started successfully!");
gameNoError = initGraphics(logFile, gameWindow, gameRenderer, "This is a title!", 800, 600);
if (gameNoError) gameNoError = doMenuLoop(logFile, gameWindow, gameRenderer, 800, 600);
if (gameNoError)
{
gameNoError = closeGraphics(logFile, gameWindow, gameRenderer);
}
else
{
closeGraphics(logFile, gameWindow, gameRenderer);
}
if (!gameNoError)
{
doLogging(logFile, "Game stopped with error/exception/problem!");
}
else
{
doLogging(logFile, "Game stopped successfully!");
}
return 0;
}
#包括
#包括
#包括
#包括“initialization/utility.hpp”
#包括“初始化/init_closeGraphics.hpp”
#包括“menuLoop.hpp”
int main(int argc,char*argv[])
{
bool gameNoError=true;
SDL_渲染器*gameRenderer=NULL;
SDL_Window*gameWindow=NULL;
FILE*logFile=fopen(“errorLog.txt”,“w”);
doLogging(日志文件,“游戏成功启动!”);
gameNoError=initGraphics(日志文件、gameWindow、gameRenderer,“这是一个标题!”,800600);
如果(gameNoError)gameNoError=doMenuLoop(日志文件、gameWindow、gameRenderer,800600);
如果(gameNoError)
{
gameNoError=closeGraphics(日志文件、gameWindow、gameRenderer);
}
其他的
{
closeGraphics(日志文件、游戏窗口、游戏渲染器);
}
如果(!gameNoError)
{
日志记录(日志文件,“游戏因错误/异常/问题而停止!”);
}
其他的
{
doLogging(日志文件,“游戏成功停止!”);
}
返回0;
}
utility.hpp仅包含日志功能
init_close.cpp:(它有它的头)
#包括“init_closeGraphics.hpp”
bool initGraphics(文件*logFile,
SDL_窗口*游戏窗口,
SDL_渲染器*游戏渲染器,
const char*游戏名称,
int gameWindowWidth,
整数(窗口高度)
{
布尔成功=真;
如果(gameWindowWidth您正在通过值将指针变量传递给initGraphics
,那么您的呼叫站点将不会看到对它们的任何更改
如果您希望在调用initGraphics
时更新main
中的变量,请通过引用获取它们:
bool initGraphics(FILE* logFile,
SDL_Window*& gameWindow,
// ^
SDL_Renderer*& gameRenderer,
// ^
const char* gameTitle,
int gameWindowWidth,
int gameWindowHeight)
您正在通过值将指针变量传递给initGraphics
,因此您的调用站点不会看到对它们的任何更改
如果您希望在调用initGraphics
时更新main
中的变量,请通过引用获取它们:
bool initGraphics(FILE* logFile,
SDL_Window*& gameWindow,
// ^
SDL_Renderer*& gameRenderer,
// ^
const char* gameTitle,
int gameWindowWidth,
int gameWindowHeight)
您正在通过值将指针变量传递给initGraphics
,因此您的调用站点不会看到对它们的任何更改
如果您希望在调用initGraphics
时更新main
中的变量,请通过引用获取它们:
bool initGraphics(FILE* logFile,
SDL_Window*& gameWindow,
// ^
SDL_Renderer*& gameRenderer,
// ^
const char* gameTitle,
int gameWindowWidth,
int gameWindowHeight)
您正在通过值将指针变量传递给initGraphics
,因此您的调用站点不会看到对它们的任何更改
如果您希望在调用initGraphics
时更新main
中的变量,请通过引用获取它们:
bool initGraphics(FILE* logFile,
SDL_Window*& gameWindow,
// ^
SDL_Renderer*& gameRenderer,
// ^
const char* gameTitle,
int gameWindowWidth,
int gameWindowHeight)
你的代码片段并没有告诉我们需要知道的内容。问题是,代码“GAMEVISULON< /COD>或<代码> GAMEMENDER E/COD>在某个时候被设置为<代码> NULL/CONDE>。你应该使用调试器来找出它。这是真的C++吗?我看不到任何不能编译为C.CeltMcTestl的东西,也许这会编译成C,但事实上是这样的。在OP中指定C++可能与答案有关(它们可以包括C++库特征,必须假设C++编译器等)。你的观点是不真实的。我猜这是真的。“AthoNoVaALeE-DuBOIS是真的。它有很大的机会我会使用C++库。你的代码片段并不能告诉我们需要知道的内容。问题是,代码< >玩家窗口< /C> >或者<代码> GAMEMENDER < /COD>在某个时候被设置为<代码> null <代码>。你应该使用调试器来找出它。这是不是全部?我不能看到任何不能编译为C.CeltMcTestl的东西,这可能会编译成C++,但是OP指定C++可能与答案有关(这可以包括C++库特性,必须假设C++编译器等)的事实。你的观点是不真实的。我猜这是真的。“AthoNoVaALeE-DuBOIS是真的。它有很大的机会我会使用C++库。你的代码片段并不能告诉我们需要知道的内容。问题是,代码< >玩家窗口< /C> >或者<代码> GAMEMENDER < /COD>在某个时候被设置为<代码> null <代码>。你应该使用调试器来找出它。这是不是全部?我不能看到任何不能编译为C.CeltMcTestl的东西,这可能会编译成C++,但是OP指定C++可能与答案有关(这可以包括C++库特性,必须假设C++编译器等)的事实。你的观点是不真实的。我猜这是真的。“AthoNoVaALeE-DuBOIS是真的。它有很大的机会我会使用C++库。你的代码片段并不能告诉我们需要知道的内容。问题是,代码< >玩家窗口< /C> >或者<代码> GAMEMENDER < /COD>在某个时候被设置为<代码> null <代码>。你应该使用调试器来找出它。这是不是全部?我不能看到任何不能编译为C.CeltMcTestl的东西,这可能会编译成C++,但是OP指定C++可能与答案有关(这可以包括C++库特性,必须假设C++编译器等)的事实。你的观点是不真实的。啊,我想那是真的。@安东尼瓦尔E-DuBOIS是真的。我有很大的机会使用C++库。