2017-09-18 7 views
-2

MISE À JOUR: Vérifiez ma réponse pour plus de détails, erreur de pointeur.Erreur de segmentation avant l'entrée de la fonction?

J'ai une fonction, qui est censée charger quelques ressources de test et les bliter sur l'écran en utilisant SDL2. Cette fonction lance une segfault immédiatement avant d'exécuter des commandes, sans cause claire. Gardez à l'esprit que certaines des variables de cette fonction sont globales.

Contenu de la fonction:

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

Avez-vous essayé d'exécuter dans gdb ou autre débogueur? Les instructions d'impression de débogage ne vous aident pas si elles ne sont pas exécutées. :) Comment l'exécutez-vous? Avez-vous un fichier core? Quelle est la sortie d'exception complète? – Rob

+1

Il se peut que printf ne s'imprime pas instantanément. Essayez 'fflush (stdout);' après chaque impression pour épingler là où il échoue. – KaeptnNemo

+1

@KaeptnNemo a raison. Alternativement, et plus en ligne avec le courant dominant, écrire des messages d'erreur sur le bien nommé 'stderr', qui pour exactement cette raison n'est pas mis en mémoire tampon par défaut. –

Répondre

1
  1. double Vérifiez les chemins d'accès sur les polices, les images, etc. Sont-elles correctes par rapport au répertoire racine du projet? Ils sont très sensibles. Pour éviter de simples erreurs comme celles-ci: passez au point 2.
  2. Appliquez un traitement de base des exceptions. Par exemple:

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

    Il est bon de toujours vérifier le résultat de votre déclaration pour vous assurer qu'il a travaillé comme prévu.

  3. Utilisez un débogueur. GDB est le plus populaire; mais j'utilise personnellement DDD, un débogueur visuel qui est exécuté sur GDB. Il est très léger et a une entrée graphique et une console.
  4. Documentez votre code. Même si c'est un projet personnel et que vous ne le montrerez à personne. Expliquez ce que chaque déclaration fait et pourquoi c'est nécessaire; vous aurez une idée plus claire du code et vous pourrez trouver le problème lui-même.

En outre, il est while(SDL_WaitEvent(&event)) pas while(SDL_WaitEvent(event)).

+0

J'ai pris ces mesures. La chose qui échoue ici est mon entrée. – jfkjsu3v95

+0

Ou oui, ça. Je l'ai complètement raté. –

+0

Cochez ma réponse, c'était une erreur de pointeur stupide, vous l'avez exactement exact, mais je n'ai pas vu votre soution avant de trouver le mien par essais et erreurs – jfkjsu3v95

0

C'est en fait une erreur stupide, et quelque chose qui pourrait arriver à n'importe qui qui est un débutant à SDL. WaitEvent (SDL_Event *) doit être alimenté par l'événement &, comme dans l'événement devrait être l'événement, pas un pointeur vers l'événement. En changeant while(SDL_WaitEvent(event)) à while(SDL_WaitEvent(&event)) et en changeant SDL_Event* event; à SDL_Event event; ce problème est résolu.

Pour toute personne rencontrant un type de segfault, le débogage dur fera l'affaire. Les gars ici à SO m'a grandement aidé à tracer et réparer mon erreur stupide, et m'a éduqué en tant que développeur.