2017-10-25 17 views
0

このコードはSIGSEGVエラーを発生させています。C++のSIGSEGVエラーSDL

#include<SDL.h> 

SDL_Window* g_pWindow = 0; 
SDL_Renderer* g_pRenderer = 0; 
int main(int argc, char* args[]) 
{ 
    // initialize SDL 
    if(SDL_Init(SDL_INIT_EVERYTHING) >= 0) 
    { 
     // if succeeded create our window 
     g_pWindow = SDL_CreateWindow("Chapter 1: Setting up SDL", 
     SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,640, 480,SDL_WINDOW_SHOWN); 
     // if the window creation succeeded create our renderer 
     if(g_pWindow != 0) 
     { 
      g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0); 
     } 
    } 
    else 
    { 
      return 1; // sdl could not initialize 
    } 
    // everything succeeded lets draw the window 
    // set to black // This function expects Red, Green, Blue and 
    // Alpha as color values 
    SDL_SetRenderDrawColor(g_pRenderer, 0, 0, 0, 255); 
    // clear the window to black 
    SDL_RenderClear(g_pRenderer); 
    // show the window 
    SDL_RenderPresent(g_pRenderer); 
    // set a delay before quitting 
    SDL_Delay(5000); 
    // clean up SDL 
    SDL_Quit(); 
    return 0; 
} 

このコードは、Sean Mitchellの「SDLゲーム開発」の書籍です。しかし、私はmingwを使用している本で示唆されているVisual Studioの代わりに。私はlazyfooのチュートリアルで説明したようにすべてを設定しました。http://lazyfoo.net/tutorials/SDL/01_hello_SDL/windows/mingw/index.php 彼の "Hello SDL"はうまく動作します。ここで が私のMakefileです:

#OBJS specifies which files to compile as part of the project 
OBJS = main.cpp 

#OBJ_NAME specifies the name of our exectuable 
OBJ_NAME = hello 

#This is the target that compiles our executable 
all : $(OBJS) 
    g++ $(OBJS) -IC:\Artur\Projects\SDL\include\SDL2 -LC:\Artur\Projects\SDL\lib -w -lmingw32 -lSDL2main -lSDL2 -o $(OBJ_NAME) -g 

そして私はgdbで見つけた:

(gdb) run 
Starting program: C:\Artur\Projects\CPP\Snake/hello.exe 
[New Thread 4800.0x45c] 
[New Thread 4800.0xc7c] 
[New Thread 4800.0xc48] 
[New Thread 4800.0xa8c] 
[New Thread 4800.0xbc0] 
[New Thread 4800.0x1350] 

Breakpoint 1, SDL_main ([email protected]=1, [email protected]=0x3b0008) 
    at main.cpp:17 
17  g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0); 
(gdb) s 
[New Thread 4800.0xf98] 

Program received signal SIGSEGV, Segmentation fault. 
0x00000000 in ?? <> 

だから私はSDL_CreateRenderer機能でその問題を知っているが、私は間違っているのか分かりません。

+0

を確認してください。これを見てみるといいかもしれません:L https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ –

+0

'g_pWindow'が' NULL'ではない場合には処理しませんが、 'g_pWindow' _IS_' NULL'ならば。私の疑惑は、それが 'NULL'を返すことであり、それはプログラムの残りの部分を引き継いでいるということです。パーミッションなどのパラメータになる可能性があります。 – M4rc

+1

'backtrace'(または' bt')gdbコマンドを使用してスタックトレースを取得し、その出力を質問に追加します。どのSDLバージョンを使用しますか?あなたはmingwの正しいlib/dllを持っていると確信していますか(MSVCではなく)?ソフトウェアレンダラを(SDL_RENDERER_SOFTWARE'で)作成できますか?そうでない場合は、スタックトレースが違うのですか? – keltar

答えて

0

あなたはので、このラインのセグメンテーションフォールトを取得している -

g_pRenderer = SDL_CreateRenderer(g_pWindow, -1, 0); 

理由はg_pWindowNULLです。あなたはこの行のNULLでそれを初期化してきたように -

SDL_Window* g_pWindow = 0; 

をあなたはSDL_Windowの有効なポインタを提供する必要があります。

詳細については、あなたは変数や式の値を表示するには、printコマンドを使用することができますgdbのではthis.

+2

この呼び出しがnullptrを使用しないようにするifステートメントのためにはそうではありませんでした。問題は私のマシンにgpu用のドライバがないということでした。私は後でそれをインストールして再試行しようとします。 – Hagartinger