丢失指针值

Losing pointer values

本文关键字:指针      更新时间:2023-10-16

我每次运行程序都得到相同的日志。

main.cpp中有一段代码,其中每个变量都在局部作用域中:

EDIT: you find at the bottom.

我创造了这些函数用于启动游戏,运行菜单循环,关闭图像,并在出现问题时为gameNoError提供假值。但是最后一个函数给了我以下日志消息:

"没有当前窗口或/和渲染器要关闭! "SDL可能没有启动,已经关闭或使用了错误的指针!"

(注意,所有日志消息都是我自己写的,因为我想使用日志记录来。)

所以,这意味着我在某个地方丢失了指针的值,但我不知道为什么?

还有我的close函数:

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;
}

utility.hpp只包含日志记录函数

init_close.cpp:

#include "init_closeGraphics.hpp"
bool initGraphics(FILE* logFile,
                  SDL_Window* gameWindow,
                  SDL_Renderer* gameRenderer,
                  const char* gameTitle,
                  int gameWindowWidth,
                  int gameWindowHeight)
{
    bool success = true;
    if (gameWindowWidth <= 0 or gameWindowHeight <= 0)
    {
        doLogging(logFile, "Get less then or equal with 0 window dimensions at SDL initialization!");
        success = false;
    }
    else
    {
        if(SDL_Init(SDL_INIT_VIDEO) < 0)
        {
            doLogging(logFile, "Failed to initialize SDL!");
            doLogging(logFile, SDL_GetError());
            success = false;
        }
        else
        {
            gameWindow = SDL_CreateWindow(gameTitle,
                                          SDL_WINDOWPOS_UNDEFINED,
                                          SDL_WINDOWPOS_UNDEFINED,
                                          gameWindowWidth,
                                          gameWindowHeight,
                                          SDL_WINDOW_SHOWN);
            if (gameWindow == NULL)
            {
                doLogging(logFile, "Failed to create window!");
                doLogging(logFile, SDL_GetError());
                success = false;
            }
            else
            {
                gameRenderer = SDL_CreateRenderer(gameWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
                if (gameRenderer == NULL)
                {
                    doLogging(logFile, "Failed to create renderer!");
                    doLogging(logFile, SDL_GetError());
                    success = false;
                }
                else
                {
                    SDL_SetRenderDrawColor(gameRenderer, 0xFF, 0xFF, 0xFF, 0xFF);
                    int IMG_FLAG = IMG_INIT_PNG;
                    if (!(IMG_Init(IMG_FLAG) & IMG_FLAG))
                    {
                        doLogging(logFile, "Failed to initialize SDL_image!");
                        doLogging(logFile, IMG_GetError());
                        success = false;
                    }
                    if (TTF_Init() == -1)
                    {
                        doLogging(logFile, "Failed to initialize SDL_ttf!");
                        doLogging(logFile, TTF_GetError());
                        success = false;
                    }
                }
            }
        }
    }
    return success;
}
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;
}

您将指针变量按值传递给initGraphics,因此您的调用站点不会看到它们的任何更改。

如果您希望在调用initGraphics时更新main中的变量,请通过引用获取它们:

bool initGraphics(FILE* logFile,
                  SDL_Window*& gameWindow,
//                           ^
                  SDL_Renderer*& gameRenderer,
//                             ^
                  const char* gameTitle,
                  int gameWindowWidth,
                  int gameWindowHeight)