2015-04-28 85 views
0

我不知道我的問題是。我試圖編譯代碼一次,它的工作。不過,我把它抄了一個新的項目,以修改它,只是顏色或等待的時間,它只是在工作的第一個程序。 有什麼不對?我感到非常沮喪。使用此代碼我想圖形的正弦函數。 這裏是我的代碼:進程返回255(0xFF的)代碼塊

#include <stdio.h> 
# include <SDL.h> 
# include <math.h> 
# define PI 3.141592 
# define SCREEN_WIDTH 640 
# define SCREEN_HEIGHT 480 

int main(int argc, char **argv){ 

    int x,y; 

    double fx,angulo; 

// Uint8* posicion; 

    Uint32 color; 

    SDL_Window*win = SDL_CreateWindow("y=sin(x)", 100,100, 640, 480, 0); 


// SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION,"info", "Window  creada",win); 

    SDL_Renderer*ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED |  SDL_RENDERER_PRESENTVSYNC); 

    /* Create surface */ 

    SDL_Surface*surface = SDL_CreateRGBSurface(0,SCREEN_WIDTH,SCREEN_HEIGHT,0,32,0,0,0); 


    //get the pixels 

    Uint32*pixels = (Uint32*)surface-> pixels; 


    /* Lock the surface */ 

    SDL_LockSurface(surface); 


    color = SDL_MapRGB(surface-> format, 255, 0, 0); 

    for(x=0;x<360;x++){ 

     angulo=x*PI/180; 

     fx=240+50*sin(angulo); 

     y=round(fx); 

     pixels[ (y* surface-> w) + x ] = color; 

    } 

    /* Unlock the surface */ 

    SDL_UnlockSurface(surface); 


    //imprescindible 

    SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, surface); 

    SDL_RenderCopy(ren,tex,NULL,NULL); 

    SDL_RenderPresent(ren); 

    SDL_Delay(1000); 

    return 0; 

} 
+1

那麼,究竟doesn't工作? – deviantfan

+1

你正在使用哪種IDE和版本,以及你的機器是哪個平臺和架構師? –

+0

Code :: blocks 13。12 –

回答

1

與你的源代碼搞亂後,我修改了它一點點,這是我想出了,我得到它來編譯和運行退出main沒有返回錯誤()。只要確保你當前的項目或解決方案被指向相應的包含文件既包括該SDL庫的目錄和靜態庫文件,並確保你在同一目錄下的DLL作爲您的可執行文件位於本項目。另外請確保您使用的是適合x86或64位的適當版本。

#include <stdio.h> 
#include <SDL.h> 
#include <math.h> 

const float PI 3.141592; 
const int SCREEN_WIDTH 640 
const int SCREEN_HEIGHT 480 

int main(int argc, char **argv) { 
    int x = 0; 
    int y = 0; 
    double fx = 0; 
    double angulo = 0; 
    Uint32 color = 0; 

    SDL_Window* win = nullptr; 
    win = SDL_CreateWindow("y=sin(x)", 100, 100, 640, 480, 0); 

    SDL_Renderer* ren = nullptr; 
    ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); 

    SDL_Surface* surface = nullptr; 
    surface = SDL_CreateRGBSurface(0, SCREEN_WIDTH, SCREEN_HEIGHT, 32, 0, 0, 0, 0); 

    Uint32* pixels = nullptr; 
    pixels = static_cast<Uint32*>(surface->pixels); 

    SDL_LockSurface(surface); 
    color = SDL_MapRGB(surface-> format, 255, 0, 0); 
    for(x=0; x<360; x++){ 
     angulo = x * PI/180; 
     fx = 240 + 50 * sin(angulo); 
     y = static_cast<int>(round(fx)); 
     pixels[ (y* surface-> w) + x ] = color; 
    } 
     SDL_UnlockSurface(surface); 

     SDL_Texture *tex = nullptr; 
     tex = SDL_CreateTextureFromSurface(ren, surface); 

     SDL_RenderCopy(ren, tex, NULL, NULL); 
     SDL_RenderPresent(ren); 
     SDL_Delay(1000); 

     return 0; 
} 

我只做了一些改變,第一是我更喜歡將const值用於全局變量而不是#DEFINES。第二個是聲明的任何變量,我將它們全部初始化爲有效的0或空狀態。我如果你沒有使用nullptr指針的選項,你仍然可以使用0或NULL,但nullptr是首選!這樣所有的指針都沒有設置或者指向內存中的任何東西。

我做第二個變化是爲數不多的鑄造叫你了!相反,這樣做的:

int someInt = 10; 
float someFloat = 0.0f; 
someInt += (int)someFloat; 

我這樣做,而不是:

someInt += static_cast<int>(someFloat); 

如果你沒有使用的static_cast <>()的選項時,將dynamic_cast <>(),reinterprest_cast <>()那麼你可以繼續從一種數據類型轉換到另一種數據類型。我喜歡鑄造的我選擇使用的原因有兩個方法,一個更安全,更乾淨的代碼讀取,而另一個用戶,甚至自己當你回去可以很容易地看到哪些類型的鑄造您使用!

至於它直到我將所有你宣佈一個nullptr指針的代碼你的錯誤首先調用相應的功能之前,在你 SDL_CreateRGBSurface()調用您有:

... = SDL_CreateRGBSurface(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 32, 0, 0, 0); 

這應該是:

... = SDL_CreateRGBSurface(0, SCREEN_WIDTH, SCREEN_HEIGHT, 32, 0, 0, 0, 0); 

發生了什麼事是你在你的位深度設置爲0,那麼你的R色面膜32爲int,因爲位掩碼用十六進制值,而不是整數定義不正確或無符號值。

下面是對文件的鏈接這個功能:SDL::CreateRGBSurface

至於能夠成功地編譯,鏈接和構建依賴於你的操作系統,IDE,你怎麼會有你的項目/解決方案設置中配置該圖書館!

我希望這可以幫助你! :)

+0

上發生問題的線路,您真是太棒了!我非常感謝你的幫助!!!!!現在我明白你的意思了,我將在下面的代碼中付諸實踐:D –

+0

非常歡迎!最好的部分是我在編程,計算機科學或軟件工程方面沒有正式的培訓或大學學分。我學到的一切都是通過研究,試驗和錯誤來自學。由於我的激情或願望是在3D圖形渲染,動畫和遊戲引擎開發中,我選擇的首選語言是C++,它是掌握其他程序集本身的最難的語言之一。我會說我處於高級中級水平。我仍然可以學習很多東西。這就是爲什麼我喜歡幫助別人來增強自己的技能。 –

+0

真的嗎?你有沒有學過你自己的一切?真棒...... –