прохождение окон SDL по ссылке / адресу - PullRequest
0 голосов
/ 29 января 2019

Я не хочу использовать глобальные переменные для SDL_Window и SDL_Renderer и любых текстур.

Поэтому я объявил окно, средство визуализации и текстуру в верхней части main () и передал их моему init () функция:

   bool init(SDL_Window* &window, SDL_Renderer* &renderer, const int height, const int width)
{
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        std::cout << "SDL_Init() failed SDL error: " << SDL_GetError() << '\n';
        return false;
    }
    else
    {
        window = SDL_CreateWindow("SDL Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0);
        if (window == NULL)
        {
            std::cout << "SDL_CreateWindow() failed SDL error: " << SDL_GetError() << '\n';
            return false;
        }
        else
        {
            renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
            if (renderer == NULL)
            {
                std::cout << "SDL_CreateRenderer() failed SDL error: " << SDL_GetError() << '\n';
            }
        }
    }

    return true;

}

вызывающая сторона в main ():

if (!init(window, renderer, WINDOW_HEIGHT, WINDOW_WIDTH))
{
    std::cout << "init() failed SDL error: " << SDL_GetError() << '\n';
}

объявления вверху main ():

    SDL_Texture* texture{};
    SDL_Window* window{};
    SDL_Renderer* renderer{};
    int WINDOW_HEIGHT = 480;
    int WINDOW_WIDTH = 640;

, как вы можете видетьв моей функции init () он принимает окно и средство визуализации в качестве аргументов и помещает их в один из них: SDL_Window * & window;Первоначально я пытался положить их в: SDL_Window * window;однако это привело бы к тому, что рендер и окно были бы нулевыми, когда программа вернулась к main ().

Я не понимаю, почему мой первоначальный метод не работал, но с использованием SDL_Window * & window;работает

Насколько я понимаю, окно - это указатель (переменная, которая содержит адрес) на структуру SDL, называемую SDL_Window, и поэтому, когда я передаю окно в параметр SDL_Window * window, оно должно дать параметру адресв моем окне я объявил в main (), и поэтому любые изменения, сделанные в окне в init (), также должны быть внесены в него в main (), однако это не так, и SDL_Window * & window в качестве параметра в итоге оказал желаемый эффект.

Если возможно, кто-нибудь может объяснить, почему это так?

1 Ответ

0 голосов
/ 29 января 2019

Думаю, из-за того, что это была первая сложная библиотека, которую я использовал, я немного запутался в природе того, как и когда создавались объекты.Благодаря HolyBlackCat вы сделали это очевидным для меня.

SDL_CreateWindow дает моему указателю окна адрес, который указывает на созданное окно, то, что я передаю в init (), является инициализированным указателем по умолчанию.по какой-то причине я подумал, что объявление указателя на SDL_Window также создает пространство в памяти для окна, это очевидно из-за способа работы указателей, что это не имеет смысла

...