Поверхность SDL возвращает NULL?

Я получаю ошибку сегментации, и я отследил ее до своей поверхности, которая равна NULL (но проверка на месте не срабатывает).

Я не уверен, правильно ли я создаю поверхность. Есть ли что-то, что мне нужно добавить при создании Surface, что-то, что я пропустил?

bool init()
{
    //Initialize SDL
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
        return false;
    }
    else
    {
        //Set texture filtering to linear
        if( !SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "1" ) )
        {
            printf( "Warning: Linear texture filtering not enabled!" );
            return false;
        }
        else
        {
            //Create window
            gWindow = SDL_CreateWindow( "kPaint", 575, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
            GUI = SDL_CreateWindow( "GUI", 0, SDL_WINDOWPOS_UNDEFINED, 573, 542, SDL_WINDOW_SHOWN );

            if( gWindow == NULL || GUI == NULL )
            {
                printf( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
                return false;
            }
            else
            {
                //Create renderer for window
                gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED );

                if( gRenderer == NULL )
                {
                    printf( "Renderer could not be created! SDL Error: %s\n", SDL_GetError() );
                    return false;
                }
                surface = SDL_GetWindowSurface( gWindow );
                GUIsurface = SDL_GetWindowSurface( GUI );

                if( surface == NULL )
                {
                    printf( "surface could not be created!" );
                    return false;
                }
                SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255,255,255));

                //Initialize PNG loading
                int imgFlags = IMG_INIT_PNG;
                if( !( IMG_Init( imgFlags ) && imgFlags ) )
                {
                    printf( "SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError() );
                    return false;
                }

            }
        }
    }
    return true;
}

person Kari Noriy    schedule 08.05.2017    source источник
comment
Попробуйте не создавать визуализатор до SDL_GetWindowSurface(). Я могу ошибаться, но iirc SDL не позволяет вам получить поверхность окна после того, как вы создали средство визуализации для этого окна.   -  person neoaggelos    schedule 08.05.2017
comment
Если он не равен нулю сразу после того, как вы его создали, но становится нулевым позже, вы, должно быть, сделали что-то, чтобы изменить его в промежутке.   -  person molbdnilo    schedule 08.05.2017
comment
Кроме того, вы можете проверить возвращаемое значение SDL_FillRect(), чтобы увидеть, не пошло ли что-то не так.   -  person neoaggelos    schedule 08.05.2017
comment
Большое спасибо, ребята. Я был так напряжен по этому поводу.   -  person Kari Noriy    schedule 08.05.2017


Ответы (1)


Спасибо НеоАглос.

Я создавал визуализатор перед поверхностями.

bool init()
{
    //Initialize SDL
    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
        return false;
    }
    else
    {
        //Set texture filtering to linear
        if( !SDL_SetHint( SDL_HINT_RENDER_SCALE_QUALITY, "1" ) )
        {
            printf( "Warning: Linear texture filtering not enabled!" );
            return false;
        }
        else
        {
            //Create window
            gWindow = SDL_CreateWindow( "kPaint", 575, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
            GUI = SDL_CreateWindow( "GUI", 0, SDL_WINDOWPOS_UNDEFINED, 573, 542, SDL_WINDOW_SHOWN );

            if( gWindow == NULL || GUI == NULL )
            {
                printf( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
                return false;
            }
            else
            {
                surface = SDL_GetWindowSurface( gWindow );
                GUIsurface = SDL_GetWindowSurface( GUI );

                if( surface == NULL )
                {
                    printf( "surface could not be created!" );
                    return false;
                }
                SDL_FillRect(surface, NULL, SDL_MapRGB(surface->format, 255,255,255));

                //Create renderer for window
                gRenderer = SDL_CreateRenderer( gWindow, -1, SDL_RENDERER_ACCELERATED );
                if( gRenderer == NULL )
                {
                    printf( "Renderer could not be created! SDL Error: %s\n", SDL_GetError() );
                    return false;
                }

                //Initialize PNG loading
                int imgFlags = IMG_INIT_PNG;
                if( !( IMG_Init( imgFlags ) && imgFlags ) )
                {
                    printf( "SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError() );
                    return false;
                }
            }
        }
    }
    return true;
}
person Kari Noriy    schedule 08.05.2017
comment
Вы не можете этого сделать. Вы обманули внутреннюю проверку ошибок SDL, но это не делает ее правильной. В руководстве по SDL для SDL_GetWindowSurface прямо указано, что его нельзя смешивать с API рендеринга. - person keltar; 08.05.2017