2017-09-18 2 views
-2

更新:詳細については私の答え、ポインタエラーを確認してください。機能エントリの前にセグメンテーションフォルトが発生しましたか?

私は、いくつかのテスト資産を読み込み、SDL2を使ってそれらを画面にblitする機能を持っています。この関数は、コマンドを実行する直前にsegfaultをスローします。明確な原因はありません。この関数の変数のいくつかはグローバルであることに注意してください。

機能の内容:

printf("DEBUG"); 
    int menuSelect = 0; 
    printf("declare"); 
    SDL_Surface* bg = SDL_LoadBMP("menubg.bmp"); 
    printf("bg load"); 
    SDL_Surface* menu1 = TTF_RenderText_Solid(font,"HACKING PROGRAM",whiteclr); 
    printf("title blip"); 
    SDL_BlitSurface(bg,NULL,screen,NULL); 
    printf("event"); 
    SDL_Event* event; 
    printf("menu2"); 
    SDL_Surface* menu2 = TTF_RenderText_Solid(font,"Hack",whiteclr); 
    printf("rect"); 
    SDL_Rect menu2r = CreateRect(5,30,menu2->w,menu2->h); 
    printf("free"); 
    SDL_FreeSurface(menu2); 
    SDL_FreeSurface(menu1); 
    while(SDL_WaitEvent(event)) 
    { 
     switch(event->type) 
     { 
      case SDL_MOUSEBUTTONDOWN: 
       if(event->motion.x > menu2r.x && event->motion.x < menu2r.x+menu2r.w && event->motion.y > menu2r.y && event->motion.y < menu2r.y+menu2r.h) 
       { 
        SDL_FreeSurface(bg); 
        return 0; 
       } 
       break; 
      case SDL_MOUSEMOTION: 
       if(event->motion.x > menu2r.x && event->motion.x < menu2r.x+menu2r.w && event->motion.y > menu2r.y && event->motion.y < menu2r.y+menu2r.h) 
       { 
        menuSelect=1; 
       } 
       else 
       { 
        menuSelect=0; 
       } 
       break; 
     } 
     if(menuSelect==1) 
     { 
      menu2 = TTF_RenderText_Solid(font,"Hack",selectclr); 
     } 
     else 
     { 
      menu2 = TTF_RenderText_Solid(font,"Hack",selectclr); 
     } 
    } 
    return 0; 
+0

gdbや他のデバッガで実行しようとしましたか?デバッグのprint文は、実行されなければあなたを助けません。 :)あなたはこれをどのように実行していますか?あなたはコアファイルを取得しますか?完全な例外出力とは何ですか? – Rob

+1

printfが瞬時に印刷されないことがあります。それぞれの印刷の後で 'fflush(stdout);'を試して、失敗した場所をピンで止めてください。 – KaeptnNemo

+1

@KeptnNemoが正しいです。あるいは、主流に沿って、エラーメッセージを適切な名前の 'stderr'に書きます。これはまさにこの理由のために、デフォルトではバッファされません。 –

答えて

1
  1. 等フォント、画像、上のパスをダブルチェックし、彼らはプロジェクトのルートディレクトリに関連して修正されていますか?彼らはかなり敏感です。これらのような単純な間違いを避けるには、ポイント2に進みます。
  2. いくつかの基本的な例外処理を適用します。例:

    SDL_Surface* bg = SDL_LoadBMP("menubg.bmp"); 
    
    if(bg == NULL) 
    { 
        // This code will be run when menubg.bmp cannot be loaded. 
    } 
    

    声明の結果を常にチェックして、計画通りに機能することを確認することをお勧めします。

  3. デバッガを使用します。 GDBは最も一般的なものです。私は個人的にはGDB上で実行される視覚的デバッガであるDDDを使用しています。非常に軽量で、グラフィカル入力とコンソール入力があります。
  4. コードを文書化してください。たとえそれが個人的なプロジェクトであっても、あなたはそれを誰にも見せないでしょう。それぞれの声明が何をし、なぜそれが必要なのかを説明する。あなたはコードのより明確な感覚を得るでしょうし、あなた自身が問題を見つけるかもしれません。

また、while(SDL_WaitEvent(&event))ないwhile(SDL_WaitEvent(event))です。

+0

私はこれらの手順を実行しました。ここで失敗したのは私のエントリーです。 – jfkjsu3v95

+0

はい、そうです。私は完全にそれを逃した。 –

+0

私の答えをチェックしてください、それは愚かなポインタエラーでした、あなたはそれを正確に得ましたが、私は試行錯誤で鉱山を見つける前にあなたのsoutionを見ませんでした – jfkjsu3v95

0

これは実際には愚かなエラーで、SDLの初心者の誰かに起こる可能性があります。イベントはイベントでなければならず、イベントへのポインタではないため、WaitEvent(SDL_Event *)には&イベントを入力する必要があります。 while(SDL_WaitEvent(event))while(SDL_WaitEvent(&event))に変更し、SDL_Event* event;SDL_Event event;に変更すると、この問題は解決されます。

どのような種類のセグメンテーションが発生している場合でも、ハードウェアのデバッグがその仕事をします。ここの人たちは、私の愚かなエラーを追跡して修正し、私を開発者として教育してくれたことを大いに助けました。

関連する問題