c - SDL2 के साथ विभाजन गलती लोडिंग बनावट




segmentation-fault sdl-2 (2)

मैंने अभी एसडीएल 1.2 का उपयोग करते हुए एक टेट्रिस क्लोन तैयार किया है, अब मैं एसडीएल 2 का बेहतर संस्करण बनाने की कोशिश कर रहा हूं। लेकिन मुझे विभाजन गलती हो रही है और मुझे नहीं पता कि क्यों

यहां valgrind रिपोर्ट है:

==9471== Memcheck, a memory error detector
==9471== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==9471== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info
==9471== Command: ./tetris
==9471== 
==9471== Thread 2:
==9471== Invalid read of size 8
==9471==    at 0xB4B57A9: ??? (in /usr/lib/x86_64-linux-gnu/nvidia/current/libGL.so.319.82)
==9471==    by 0x4E8094E: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.1.0)
==9471==    by 0x4E799EA: SDL_CreateTexture (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.1.0)
==9471==    by 0x4E79C6D: SDL_CreateTextureFromSurface (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.1.0)
==9471==    by 0x401176: load_texture.3137.2439 
==9471==    by 0x401194: video_load_image.2436
==9471==    by 0x4011B6: block_image_load_all.2429
==9471==    by 0x4017BD: run_game_logic.2384
==9471==    by 0x541B061: start_thread (pthread_create.c:312)
==9471==    by 0x5715A3C: clone (clone.S:111)
==9471==  Address 0x8c0 is not stack'd, malloc'd or (recently) free'd
==9471== 
==9471== 
==9471== Process terminating with default action of signal 11 (SIGSEGV)
==9471==  Access not within mapped region at address 0x8C0
==9471==    at 0xB4B57A9: ??? (in /usr/lib/x86_64-linux-gnu/nvidia/current/libGL.so.319.82)
==9471==    by 0x4E8094E: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.1.0)
==9471==    by 0x4E799EA: SDL_CreateTexture (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.1.0)
==9471==    by 0x4E79C6D: SDL_CreateTextureFromSurface  (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.1.0)
==9471==    by 0x401176: load_texture.3137.2439
==9471==    by 0x401194: video_load_image.2436
==9471==    by 0x4011B6: block_image_load_all.2429
==9471==    by 0x4017BD: run_game_logic.2384
==9471==    by 0x541B061: start_thread (pthread_create.c:312)
==9471==    by 0x5715A3C: clone (clone.S:111)
==9471==  If you believe this happened as a result of a stack
==9471==  overflow in your program's main thread (unlikely but
==9471==  possible), you can try to increase the size of the
==9471==  main thread stack using the --main-stacksize= flag.
==9471==  The main thread stack size used in this run was 8388608.

और कार्य:

SDL_Texture *video_load_image(const char *file)
{
    return load_texture(file);
}

static SDL_Texture *load_texture(const char *path)
{
    SDL_Surface *surface;
    SDL_Texture *texture;

    if((surface = SDL_LoadBMP(path)) == NULL){
        puts("invalid path");
        return NULL;
    }

    texture = SDL_CreateTextureFromSurface(renderer, surface);
    SDL_FreeSurface(surface);

    return texture;
}

char *image_path[BLOCK_COUNT] = {
    "img/block_dark_cyan32.bmp", "img/block_dark_red32.bmp",
    "img/block_dark_brown32.bmp", "img/block_dark_magenta32.bmp",
    "img/block_dark_gray32.bmp", "img/block_dark_green32.bmp",
    "img/block_dark_blue32.bmp", 
    "img/block_wall32.bmp", "img/block_empty32.bmp"
};

SDL_Texture *textures[BLOCK_COUNT];

int block_image_load_all(void)
{
    for(int i = 0; i < BLOCK_COUNT; ++i){
        if((textures[i] = video_load_image(image_path[i])) == NULL){
            while(i > 0)
                video_free_image(textures[--i]);

            return ERROR;
        }
    }

    return SUCCESS;
}

क्या खंडन गलती पैदा कर रही है यहाँ?

अद्यतन: रेंडरर को SDL_RENDERER_SOFTWARE स्विच करने से समस्या हल होती है, लेकिन मैं SDL_RENDERER_ACCELERATED का उपयोग करना SDL_RENDERER_ACCELERATED

मुझे नहीं लगता कि समस्या ड्राइवर है क्योंकि मैं सफलतापूर्वक किसी अन्य प्रोग्राम में SDL_RENDERER_ACCELERATED का उपयोग कर रहा हूं।


सुनिश्चित करें कि SDL_CreateRender() का प्रयोग करते समय 1 को अपनी दूसरी तर्क के रूप में डाल दिया जाए ताकि एसडीएल स्वत: उपयोग करने के लिए एक वैध वीडियो कार्ड चुन ले।

यदि समस्या बनी रहती है, तो अपने वीडियो कार्ड ड्राइवरों को अपडेट करें (कंप्यूटर को पुनरारंभ करें)।

टिप्पणी अगर यह अभी भी बनी रहती है


ऐसा लगता है कि आप अपने कोड में फ़ॉन्ट को मुक्त नहीं कर रहे हैं। प्रयत्न:

TTF_CloseFont(TTF_Font *font);

आपके द्वारा फ़ॉन्ट का उपयोग करने के बाद या कुछ सौ फ़्रेम के बाद एक विभाजन गलती का कारण होगा।





sdl-2