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

Discussion :

Erreurs de segmentation à répétition

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut Erreurs de segmentation à répétition
    Bonjour, je suis débutant en QT. J'essaie de faire un petit jeu pour m’entraîner. Mais le problème est que je me retrouve bloquer par divers crash de type Segment fault exception. Dans le jeu, je dois détruire divers astéroïdes, mais lors du dernier (avant que l'application retire les objets de la scène) l'application crash, idem lorsque le vaisseau du joueur explose.

    Il y a d'autre problème que je n'arrive plus à résoudre :

    Parfois, des astéroïdes n’apparaissent pas (alors que 90 % du temps tout ce passe comme prévues et dans les mêmes conditions)

    Si je spam le bouton start, la scène ne se vide pas les objets précédent (si je fais lentement il n'y à aucun problème)

    J'ai tenté de placer le point d'origine au milieu de l'objet spaceship sans succès, j'ai essayé avec setTransformOriginPoint() dans le constructeur, plus diverse technique vus sur le net, mais aucun n'a fais de changement que se soit setTransformOriginPoint(boundingRect().center());
    Ou
    QPointF centerSkin(skin.width() / 2, (skin.height() / SettingsSpaceship::getNumberFrame())/2);
    setTransformOriginPoint(centerSkin);
    Rien n'y fait.

    Il s'agit de mes derniers bugs où je me casse les dents. Je poste le projet dans un dossier sur méga, car il y a trop de code pour le poster. Merci d'avance

    https://mega.nz/#!rIsm3AjR!7ycyhV0sj...NVArNtPNKZVp90

  2. #2
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Utilise un outil pour trouver l'origine du crash. Si tu es sous Qt Creator tu peux lancer ton jeu en mode Debug avec F5 (par défaut), utilise ton programme pour arriver dans un cas où ça plante et tu verras sur quelle ligne et dans quel contexte tu as un crash. Parfois il faut regarder la pile d'appel car le problème ne se situe pas sur la ligne en elle même temps mais en amont dans une fonction appelante (qui appelle des fonctions sur un objet détruit par exemple).

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Oui j'utilise le déboguer, il y a bien des objets qui sont mis à null mais je ne sais pas pourquoi ils le sont car il se terminent de la même façons que les autres..

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Ça peut vite être un casse tête, mais cela dépend de ton architecture et une architecture bien modulaire permet de limiter ce genre de "je ne sais pas pourquoi". Tu peux commencer par mettre à plat qui crée qui et qui détruit qui. Normalement avec le système parent-enfant de Qt on ne détruit jamais ou pas souvent des objets. Pose toi donc la question pour chaque objet que tu crées : qui est son parent (ou sera son parent) ? Ce parent détruira ton objet quand lui même sera détruit, donc demande toi ensuite quand ce parent est-il détruit ? Si le comportement te parait toujours anormal (cad des objets null quand ils ne devraient pas l'être), cherche si ton code pourrait changer le parent de tes objets (certaines affectations dans Qt prennent possession de l'objet, cad en deviennent implicitement le parent).

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Et bien je ne sais suis pas vraiment sur mais j'ai l'impression que mon problème vient du fait que la fonction removeAll() dans gameView.c essai d'atteindre un objet (le dernier astéroïde) lorsque celui ci est en train de se détruire lui même ..

    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
    // Bug? crash du jeux
    void GameView::removeAll(){
     
        // supprimer tous les items                         (fonctionne ? )
     
        QList<QGraphicsItem*> all = items();
        for (int i = 0; i < all.size(); i++)
        {
            QGraphicsItem *gi = all[i];
            if(gi->parentItem()==NULL) {
                delete gi;
            }
        }
     
        //this->grfxScene->clear();                           // clear en plus?
    }
    Y a t'il moyen de gérer le fait que l'objet soit détruit ? Exemple un try catch(null pointer exception) comme ne java ?

  6. #6
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Non il n'y a pas moyen d'intercepter le crash comme en Java à ma connaissance. Une fois que tu utilises un pointeur invalide ça plante, il faut le détecter en amont.

    Comme je le disais avec le système parent-enfant de Qt les objets sont détruits automatiquement par leur parent et tu n'as pas à gérer les delete toi même. Pourquoi cette fonction du coup ? Est-ce que tu as vraiment besoin de parcourir et détruire tes objets ? Vérifie bien dans ton code à quel moment tu les crées, et qui est leur parent, tu pourras déduire quand le parent va les détruire (à sa propre destruction) et architecturer ton code en fonction de ça.
    Dans ton cas pourquoi ton astéroïde se détruirait lui même ? Est-ce que tu appelles un delete explicitement ? Est-ce que des traitements pourraient implicitement le détruire ?

    Si tu as vraiment besoin de détruire manuellement des objets, la fonction deleteLater() peut aussi t'intéresser car elle permet de "programmer" la destruction de l'objet plus tard dans la boucle d'évènements et donc d'éviter qu'un code qui suit utilise l'objet déjà détruit ou qu'un évènement empilé vienne demander un objet détruit, on peut généralement s'en passer si l'on a bien organisé le déroulement du code et les durées de vie des objets.
    Tu peux aussi faire des tests avec le signal destroyed() de QObject qui indique qu'un objet va être détruit pour afficher des traces, ou t'attacher dans debug dans le destructeur de ton astéroïde pour vérifier qui le détruit.

Discussions similaires

  1. Réponses: 10
    Dernier message: 31/12/2009, 11h35
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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