簡體   English   中英

使用SDL時出現分段錯誤

[英]Segmentation fault while using SDL

[求助]我正在關注這個教程(視頻) ,我就在這一刻。 編譯時我沒有遇到任何問題,但是當它運行程序時,它只是閃爍一秒鍾然后關閉。 所以,我運行調試,我發現從分割故障SDL_DisplayFormatload_image功能,當我評論過線,我加載它工作正常圖像,但我無法找到問題的原因。

[解決方案]我沒有填寫.bmp文件,這就是SDL_DisplayFormat不起作用的原因。 一旦提交了繪圖,一切都開始起作用了。

這是我的代碼:

#include "game.h"
/*TODO 
*stworzyć plik z blokami "blocks.bmp"
*stworzyć plik  z tlem "background.bmp"
*uzywac jako tla do obrazkow 000,255,255
*
*/
game::game()
{
    //zaladowanie ekranu
    SDL_Init(SDL_INIT_EVERYTHING);
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGTH, 32, SDL_SWSURFACE);
    //ladowanei obrazkow

    //ustawianie polozenia i rozmiaru kamery
    camera.x = camera.y = 0;
    camera.w = SCREEN_WIDTH;
    camera.h = SCREEN_HEIGTH;
    //inicjalizacja kierunku w kotrym sie poruszamy
    direction[0] = direction[1] = 0;
    running = true;
    block = (load_image("blocks.bmp"));
    background = (load_image("background.bmp"));
}
game::~game()
{
    SDL_FreeSurface(block);
    SDL_FreeSurface(background);
    SDL_Quit();
}
SDL_Surface* game::load_image (const char* filename)
{
    SDL_Surface* tmp = SDL_LoadBMP(filename);
    SDL_Surface* tmp2 = SDL_DisplayFormat(tmp);
    //do odkomentowania kolorkey na razie zeby sprawdzac kolizje
    //  SDL_SetColorKey(tmp2, SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0x00, 0xff, 0xff)
    SDL_FreeSurface(tmp);
    return tmp2;
}
void game::handleEvents()
{
    SDL_Event event;
    while(SDL_PollEvent(&event))
    {
        switch(event.type)
        {
            case SDL_QUIT:
                running = false;
                return;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_LEFT:
                        direction[0] = 1;
                        break;
                    case SDLK_RIGHT:
                        direction[1] = 1;
                        break;
                }
                break;
            case SDL_KEYUP:
                switch(event.key.keysym.sym)
                {
                    case SDLK_LEFT:
                        direction[0] = 0;
                        break;
                    case SDLK_RIGHT:
                        direction[1] = 0;
                        break;
                }
                break;
        }
    }
}
void game::start()
{
    while(1)
    {
        handleEvents();
        SDL_Flip(screen);
    }
}

一個建議:提供完整的,最少的代碼,包括編譯指令。 你的沒有main()函數,也沒有類定義(game.h)。 在重新構建並在調試器中運行它之后,我發現第一個SDL_LoadBMP()返回NULL(也許這與你的相同,但這里肯定是我沒有相應文件的情況),所以我沒有線索如果你有同樣的問題。

現在,您可以嘗試解決此問題的方法是檢查返回值。 在這種情況下,試試這個:

SDL_Surface* tmp = SDL_LoadBMP(filename);
if(!tmp)
    throw std::runtime_error("SDL_LoadBMP() failed");

使用unique_ptr或一些自定義包裝類也是一個很好的建議,以免泄漏資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM