2013-12-20 87 views
0

這個SDL程序工作正常(顯示一個窗口並在其上繪製位圖),但是,如果我在程序中聲明任何變量(如int,long等),則窗戶凍結,是白色而不是黑色,沒有畫。什麼可能造成這種情況?SDL在聲明任何標準變量時崩潰

#include <stdio.h> 
#include <SDL2/SDL.h> 
#include <SDL2/SDL_image.h> 

int main(int argc, char* argv[]) { 
    // line below will cause SDL crash 
    // int blabla = 640; 
    SDL_Window *window; 
    SDL_Init(SDL_INIT_VIDEO); 
    window = SDL_CreateWindow(
     "A rather exceptional SDL window", 
     SDL_WINDOWPOS_UNDEFINED, 
     SDL_WINDOWPOS_UNDEFINED, 
     640, 
     480, 
     SDL_WINDOW_OPENGL 
    ); 
    if (window == NULL) { 
     printf("Could not create window: %s\n", SDL_GetError()); 
     return 1; 
    } 
    SDL_Renderer *renderer; 
    SDL_Texture *texture; 
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 
    SDL_Surface *brush; 
    brush = IMG_Load("brush2.png"); 
    texture = SDL_CreateTextureFromSurface(renderer, brush); 
    SDL_RenderClear(renderer); 
    SDL_Rect *sRect, *dRect; 
    sRect->w = 10; 
    sRect->h = 4; 
    sRect->x = 0; 
    sRect->y = 0; 
    dRect->w = 10; 
    dRect->h = 4; 
    dRect->x = 10; 
    dRect->y = 10; 
    SDL_RenderCopy(renderer, texture, sRect, dRect); 
    SDL_RenderPresent(renderer); 
    SDL_Delay(1000); 
    SDL_DestroyWindow(window); 
    SDL_Quit(); 
    return 0; 
} 
+0

你在哪裏聲明瞭這個變量? – rullof

+0

@rullof查看註釋掉的行「int blabla = 640」 - 是的,_indeed_,如果聲明瞭無關的變量(或任何不相關的變量),SDL將凍結而不繪製。它會很好地編譯,如果沒有SDL代碼,就沒有問題,但由於某些原因,如果我嘗試定義任何不相關的標準變量(例如註釋掉的行),SDL就會凍結。 – user353885

+0

換句話說,由於「int blabla = 640」被註釋掉了,你上面看到的代碼編譯得很好。如果你取消註釋「int blabla = 640」或寫入「int bob = 44」或「long joe = 34」,它當然會編譯好,但是_SDL將凍結並且不會繪製。我希望這是有道理的。 – user353885

回答

6

您正在編寫未分配的內存。

SDL_Rect *sRect, *dRect; 
sRect->w = 10; /* w doesn't exist. Writing is undefined behaviour. */ 

sRectdRect只是指針。他們需要在訪問結構成員之前指向有效內存。

你可以在堆棧聲明它們來代替:

SDL_Rect sRect, dRect; 
sRect.w = 10; 
sRect.h = 4; 
... 
SDL_RenderCopy(renderer, texture, &sRect, &dRect); 

您也應該檢查的SDL_ -functions返回值。如果這些失敗,並且您繼續執行,您可能會遇到奇怪的行爲或崩潰。

+0

這些行不會導致錯誤 - SDL要求提供指針並且該代碼有效。它只是聲明導致SDL凍結的變量(與SDL無關的任何變量 - _unrelated_是關鍵部分)。查看註釋掉的行「int blabla = 640」如果我取消註釋該行或聲明任何變量,SDL將凍結。如果我不_聲明任何變量,一切正常,SDL在屏幕上繪製。與其他人可能有什麼關係?程序中甚至沒有使用「blabla」變量,也不會引起任何錯誤 - 爲什麼SDL會在聲明無關變量時凍結? – user353885

+2

'sRect-> w = 10;'寫入未分配區域。這會導致未定義的行爲。這意味着**任何**都可能發生。它可能工作,它可能無法正常工作,可能會因完全不相關的原因而崩潰。聲明變量'blabla'最有可能改變'sRect'在堆棧上的位置,這意味着指針的初始值(垃圾)值是不同的。首先工作是純粹的運氣。 – user694733

+0

謝謝 - 您的解決方案確實解決了它。我仍然不明白爲什麼C會讓你寫入未分配的區域(那麼分配的地點是什麼?)以及這意味着「什麼都可能發生」(例如,即使未分配區域是「blabla」變量,它仍然不應該不會影響SDL,因爲變量不會被SDL訪問,也不會影響SDL,但它可以工作,所以再次感謝,我將繼續。 – user353885