Search code examples
c++structsdl-2compiler-warnings

Inconsistent C26496 warning


I recently refactored my SDL2 C++ code using structs. It compiles and runs fine (using Visual Studio 2019), but is now throwing out an inconsistent warning:

C26496 Variable 'Graphic::X' is uninitialized. Always initialize a member variable.

This repeats for X = h, w, x, and y for the lines of code representing the renderTexture function. However, the warning does not show up for the mouseOverRect function that comes prior, both of which use Graphic struct variables in the exact same way.

I have included the relevant parts of my code below. I'm trying to figure out what caused the warning and why it didn't repeat for both functions?

header file

    int mouse_x;
    int mouse_y;

    struct Graphic
    {
        std::string name;
        std::string type;
        int x;
        int y;
        int h;
        int w;
    };

source file

    //Initialization
    SDL_Window* window = NULL;                                      
    SDL_Renderer* renderer = NULL;
    SDL_Rect* clip = NULL;

    //Log Error Function
    void logSDLError(std::ostream &os, const std::string &msg)
    {
        os << msg << " error: " << SDL_GetError() << std::endl;
    }

    //Mouse Over Rectangle Function
    bool mouseOverRect(int x, int y, Graphic &graphic)
    {
        if ((x <= graphic.x + graphic.w) && (x > graphic.x) &&
            (y <= graphic.y + graphic.h) && (y > graphic.y))
            return true;
        else
            return false;

    //Render Texture at Destination Function
    void renderTexture(SDL_Texture* texture, SDL_Renderer* renderer, Graphic &graphic,
        SDL_Rect *clip = nullptr)
    {
        SDL_Rect dest;
        dest.x = graphic.x;
        dest.y = graphic.y;
        dest.h = graphic.h;
        dest.w = graphic.w;

        SDL_RenderCopy(renderer, texture, clip, &dest);
    }

    // Main Function
    int main(int, char**)
    {
        //Start up SDL
        if (SDL_Init(SDL_INIT_VIDEO) != 0)
        {
            logSDLError(std::cout, "Cannot initialize SDL video.");
        }

        //Setup window and renderer
        SDL_Window *window = SDL_CreateWindow("Dragon Hunt", SDL_WINDOWPOS_CENTERED,
                SDL_WINDOWPOS_CENTERED, Screen_Width, Screen_Height, SDL_WINDOW_RESIZABLE);
        if (window == nullptr)
        {
            logSDLError(std::cout, "Cannot create window.");
        }
        SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
        if (renderer == nullptr)
        {
            logSDLError(std::cout, "Cannot create renderer.");
        }

        struct Graphic createbutton;
            createbutton.name = "Create Forest";
            createbutton.type = "longbutton";
            createbutton.x = 0;
            createbutton.y = 1 * (Screen_Width / 5) + 5;
            createbutton.h = Screen_Width / 10;
            createbutton.w = Screen_Width / 5;

        SDL_Event e;
            //For tracking if we want to quit
            bool quit = false;
            while (!quit) {
                while (SDL_PollEvent(&e))
                {
                    switch (e.type)
                    {
                    case SDL_MOUSEMOTION:
                        mouse_x = e.motion.x;
                        mouse_y = e.motion.y;
                        if (mouseOverRect(mouse_x, mouse_y, createbutton))
                            useCreate_Clip = CREATE_HOVER;
                        else
                            useCreate_Clip = CREATE_DEFAULT;
                        break;
                    }

        renderTexture(longbutton_image, renderer, createbutton, &create_clips[useCreate_Clip]);
    }

Solution

  • None of your structure's members are initialized. They are assigned to after initialization would have been done.

    Initialize your structure when you declare it, something like

    Graphic createbutton {
        "Create Forest",
        "longbutton",
        0,
        1 * (Screen_Width / 5) + 5,
        Screen_Width / 10,
        Screen_Width / 5
    };
    

    Note that you don't need the struct keyword here.