IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Erreur segmentation fault en affichant du texte [SDL 1.2]


Sujet :

SDL

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Par défaut Erreur segmentation fault en affichant du texte
    Bonjour à tous,
    Je suis étudiant en informatique et j'ai un projet à rendre pour la fin de semaine prochaine.
    J'ai pratiquement fini, mais j'ai un gros soucis, j'ai voulu faire quelques affichages à l'écran et je ne sais pas pourquoi, mais j'obtiens des segmentation fault...
    Les affichages que je voulais faire : Le score en bas du jeu, un message de changement de niveau entre chaque niveau.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    string point(int niveau)
    {
        ostringstream mssg;
        mssg.flush();
        mssg.str("");
        mssg << niveau;
        return mssg.str();
    }
     
    bool switchLvl(SDL_Surface* screen, Canard &c, Canard &c2, SDL_Surface *fond, int compteurBalles, SDL_Event event, int &niveau, bool etatJeu, bool &init, int &tour)
    {
        TTF_Font *font;
        SDL_Color textColor= {0,0,0};
        applySurface(0,0,fond,screen,NULL);
        ostringstream mssg;
        mssg.flush();
        mssg.str("");
        mssg << "Niv";
     
        ostringstream n;
        mssg.flush();
        mssg.str("");
        mssg << niveau;
     
        ostringstream mssg2;
        mssg.flush();
        mssg.str("");
        mssg << "Cliquez pour continuer";
     
     
     
     
        font = TTF_OpenFont("duck_hunt.ttf",30);
     
     
     
        if (init==true)
        {
            niveau++;
            init=false;
        }
     
        initCanard(c,niveau);
        initCanard(c2,niveau);
        compteurBalles=0;
    //    showMessageScreen("niveau",SCREEN_WIDTH/3,SCREEN_HEIGHT/3.3,font,30,textColor,screen);
    //    showMessageScreen(point(niveau),SCREEN_WIDTH/2,SCREEN_HEIGHT/3.3,font,30,textColor,screen);
    //    showMessageScreen("Cliquez pour continuer",SCREEN_WIDTH/4,SCREEN_HEIGHT/2,font,30,textColor,screen);
     
     
     
     
        while(SDL_PollEvent(&event))
        {
            if (event.button.state==SDL_PRESSED)
            {
     
                tour=0;
            }
        }
        SDL_Flip(screen);
        TTF_CloseFont(font);
        return etatJeu;
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    void
    showMessageScreen(string message,int x,int y,
                      TTF_Font *font,int fontSize,SDL_Color textColor,SDL_Surface* &screen)
    {
        string mot="";
        string space=" ";
        int i=0,j;
        SDL_Surface *mes=NULL;
     
        j = message.find(space);
        while( j != string::npos )
        {
            mot=message.substr(i,j-i);
            if(mot != "")
            {
                mes=TTF_RenderText_Solid(font,mot.c_str(),textColor);
                applySurface(x,y,mes,screen,NULL);
                x+=mes->w;
                SDL_FreeSurface(mes);
            }
            x+=fontSize;
            i=j+1;
            j = message.find(space,i);
        }
     
        mot=message.substr(i);
        mes=TTF_RenderText_Solid(font,mot.c_str(),textColor);
        applySurface(x,y,mes,screen,NULL);
        SDL_FreeSurface(mes);
    }

    Je n'ai pas mis le code pour le score parce que je suppose que le problème est le même...
    Le code de la fonction showMessageScreen nous à été fournit par notre professeur.
    Vous verrez des osstringstreametc un peu en vrac à un endroit, je les avais utilisé pour faire de multiples tests et ne plus avoir de segfault mais sans succès....


    Merci d'avance et bonne journée

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Salut,

    et que dit le debugger ? Il t'indiquera la ligne où ça se produit, et tu pourras voir directement d'où vient le problème.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Par défaut
    Bonsoir,
    tout d'abord merci d'avoir pris le temps de me répondre
    Le debugger me renvoie à la ligne 27 de la fonction showMessageScreen : mes=TTF_RenderText_Solid(font,mot.c_str(),textColor);
    Comme je l'ai précisé, ce n'est pas moi qui ai codé cette fonction mais mon professeur puisque nous n'avons pas encore abordé le programmation orientée objets (programme du second semestre), ce qui explique que je ne connais pas son contenu que je ne saurais comprendre... Pourriez-vous m'éclairer ?

    Bonne soirée

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Est-ce que font est correctement initialisée ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Par défaut
    Sachant que le bug vient de mes showMessageScreen, qui a t-il à initialiser ? J'ai essayé d'afficher des messages simples (et non des entiers transformés en string) pour voir, toujours le même soucis...

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2014
    Messages : 5
    Par défaut
    Salut

    Essayes en retirant le SDL_FreeSurface(mes); à la ligne 19 dans la fonction que ton prof t'a donné.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 145
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par VynOffline Voir le message
    Salut

    Essayes en retirant le SDL_FreeSurface(mes); à la ligne 19 dans la fonction que ton prof t'a donné.
    Ca c'est la porte ouverte à un leak.
    Le applySurface est certainement un blit, puis il faut libérer la mémoire allouée avec le renderText
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2014
    Messages : 5
    Par défaut
    Tu me mets le doute la...
    Ça ne pose pas de probleme de libérer une surface qu'on re utilise ensuite ?
    Et puis la mémoire est libéré dans tous les cas a la fin de la fonction non ?

    Edit: Tu as raison, j'avais oublié que le RenderText renvoyait a chaque fois une nouvelle surface, autant pour moi.

    Sinon, l'erreur n'est qu'á la ligne 27 et pas á la 16 ?

  9. #9
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    C'est ton code source en entier ?
    Parce que si tu t'es amusé avec les pointeurs et qu'il y a un dépassement autre part , c'est normal que c'est une fonction qui n'a rien a voir avec ton bug qui fait planter le programme
    Je dis cela parce que c'est l'erreur courante de 90% des personnes qui code en SDL et qui ont un buffer overflow c'est souvent la fonction SDL qui fera planter le programme (mais la cause est ailleurs , pointeur , dépassement d'un tableau ect).

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 054
    Billets dans le blog
    141
    Par défaut
    Bonjour,

    Citation Envoyé par anthonynguyen0 Voir le message
    Comme je l'ai précisé, ce n'est pas moi qui ai codé cette fonction mais mon professeur puisque nous n'avons pas encore abordé le programmation orientée objets (programme du second semestre), ce qui explique que je ne connais pas son contenu que je ne saurais comprendre... Pourriez-vous m'éclairer ?

    Même si ce n'est pas votre fonction, ou que l'on vous a dit : vous ne pouvez pas comprendre, vous devriez essayer. D'une part, je doute qu'il y ai du code trop illogique pour qu'il puisse être logique et d'autre part : il faut être curieux dans la vie.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 38
    Par défaut
    Bonjour,
    mon soucis est réglé, le problème venait du fait que ma fonte se chargeait en boucle... Un passage en paramètre et le tour est joué !!! merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo