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 :

Signal SIGSEGV, qu'est-ce ? [SDL 2.0]


Sujet :

SDL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Signal SIGSEGV, qu'est-ce ?
    Bonjour à tous,

    Je viens de compiler mon programme c++ avec SDL2 et SDL2_gfx et une fois que je lance le .exe Windows me dit "le programme a cessé de fonctionner". Donc je lance gdb (je suis un gros noob avec gdb) et
    là je peux observer le message suivant : "Program received signal SIGSEGV, Segmentation fault". ok.
    Tout d'abord j'avoue ne pas comprendre le signal SIGSEGV.
    De plus j'aimerais savoir comment vous vous réglez ce genre de problème : quel est votre "procédure" pour traiter cette erreur. Je ne vous met pas de morceau de mon code ou de screen tout simplement parce que
    le but n'est pas que vous trouviez la solution à mon problème à ma place mais plutôt que je comprenne la méthode pour régler ce genre de problème.

    En vous remerciant.

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    segmentation fault = tu as probablement un pointeur pourri quelquepart
    Si tu lances avec gdb, il devrait s'arrêter sur la ligne en question non ?
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    En effet gdb s'arrête à une ligne. Si j'ai bien compris il s'arrête à la ligne 2614 de src/video/SDL_video.c mais en même temps il me dit "No such file or directory", je ne comprend pas trop ce qu'il essaie de me dire là...

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Ok, je crois avoir compris mon erreur !

    En gros j'ai un bloc SDL_Init(INIT_EVERYTHING) et si il est égal à 0 il initialise les pointer window et renderer, et une fois fais il passe le booléen run en true ce qui lui permet de faire tourner la boucle principal. Si run != true alors il clean tout. Dans mon cas SDL ne s'initialise pas et passe direct au clean() ce qui engendre un problème de pointer (SIGSEGV) au moment de du SDL_DestroyWindow(window).

    Si quelqu'un à une idée de pourquoi SDL n'a pas réussi à s'initialiser je suis preneur !

  5. #5
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    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 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Un code source serait assez utile si tu veux qu'on t'aide !

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Voilà tout d'abord le main:

    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
    #include "Jeu.h"
    #include <iostream>
     
    using namespace std;
     
    //#define FPS 60
     
    Jeu* jeu;
    int main(int argc, char **argv){
        jeu = new Jeu();
        jeu->init("test",
                   SDL_WINDOWPOS_UNDEFINED,
                   SDL_WINDOWPOS_UNDEFINED,
                   1280,
                   720,
                   false);
     
        while(jeu->run()){
            jeu->events();
            jeu->update();
            jeu->render();
        }
     
     
        jeu->clean();
        return 0;
    }
    et ensuite la fonction Init() de Jeu:

    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
    void Jeu::init(const char* title, int xpos, int ypos, int width, int heigth, bool fullscreen){
        int fl = fullscreen == true ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_SHOWN;
     
        if(SDL_Init(SDL_INIT_EVERYTHING)==0){
            window = SDL_CreateWindow(title, xpos, ypos, width, heigth, fl);
            if(window){
            }
     
            renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
            if(renderer){
                SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
            }
     
            isRun = true;
        }
        else{
            isRun = false;
        }
     
        joueur = new Joueur(width/2, heigth/2, renderer);
    }

  7. #7
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    - jeu n'a aucune raison d'être créé dans la heap
    - ça aurait évité une fuite mémoire
    - init qui ne retourne pas son succès ou non
    - peu de vérification de succès : si la window ne se crée pas ? si le renderer ne se crée pas ?
    - aucun affichage des erreurs éventuelles

    Ensuite ou verra le pourquoi du problème qui t'amène, qui peut n'être qu'un problème de configuration ou que sais-je.
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Ok j'ai changé tout ça et maintenant ça marche, voilà le nouveau code d'initialisation :

    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
    void Jeu::init(const char* title, int xpos, int ypos, int width, int heigth, bool fullscreen){
        int fl = fullscreen == true ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_SHOWN;
     
        SDL_Init(SDL_INIT_EVERYTHING);
        if(SDL_Init(SDL_INIT_VIDEO)!=0){
            cout << SDL_GetError() << endl;
        }
        if(SDL_Init(SDL_INIT_EVENTS)!=0){
            cout << SDL_GetError() << endl;
        }
     
        if(SDL_Init(SDL_INIT_VIDEO)==0){
            window = SDL_CreateWindow(title, xpos, ypos, width, heigth, fl);
            if(window){
                renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
                if(renderer){
                    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
                }
            }
            isRun = true;
        }
        else{
            isRun = false;
        }
     
        joueur = new Joueur(width/2, heigth/2, renderer);
    }


    - jeu n'a aucune raison d'être créé dans la heap
    Qu'entends-tu par là ?

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 416
    Points : 1 443
    Points
    1 443
    Par défaut
    Citation Envoyé par Vinkkk Voir le message
    Qu'entends-tu par là ?
    Cette ligne:

    N'est pas indispensable, surtout que "Jeu* jeu;" est une déclaration globale (si cette ligne était dans le main() et que Jeu était énorme, il serait déclaré sur la stack et serait donc potentiellement trop gros. Ça m'est déjà arrivé :p ).
    Bref jeu pourrait être déclaré comme un Jeu et non un Jeu*: il est initialisé une fois, et le pointeur ne change pas pendant toute la durée de l'exécution du programme, donc pourquoi l'allouer dynamiquement?

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Ok , merci Guntha, je comprend maintenant !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/03/2010, 00h20
  2. Réponses: 6
    Dernier message: 04/11/2009, 10h57
  3. le catch du signal SIGSEGV.
    Par death_style dans le forum Bibliothèque standard
    Réponses: 46
    Dernier message: 08/09/2009, 13h59
  4. Réponses: 0
    Dernier message: 10/01/2008, 23h28
  5. Réponses: 15
    Dernier message: 15/04/2007, 13h31

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