丢失指针值

Losing pointer values

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

main.cpp 中有一个片段,其中每个变量都在局部范围内:

EDIT: you find at the bottom.

我为启动游戏、运行 菜单循环和关闭图形制作了这些功能,如果出现问题,则为 gameNoError 提供 false 值。但是最后一个函数给了我以下日志消息:

"No present window or/and renderer to close! SDL possibly not started, closed already or wrong pointers used!"

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

所以,这意味着我在某处丢失了指针的值,但我找不到原因?

还有我的关闭功能:

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:(它有 header)

#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)