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

C++ Discussion :

Segmentation fault : méthode sur objet dynamique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut Segmentation fault : méthode sur objet dynamique
    Bonjour,
    Je suis confronté a un segmentation fault dont je n'arrive pas à me défaire.
    Je sais que je ne dépasse pas la ligne 139 de mon main.cpp, qui utilise ma méthode enVie sur un Monstre et un Personnage, cependant le Monstre fonctionne mais dès que le programme passe à l'instruction suivante qui est . le seg fault arrive
    J'ai cette erreur depuis que je passe par un fichier pour initialiser mon Personnage (pour pouvoir sauvegarder mon personnage).
    Si vous changez cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /*Attaque* attaque[]={new Attaque(), //Ligne 123 du main.cpp
                            new Attaque("Gros coup",150,20,2,0),
                            new Attaque("Assez gros coup",300,50,5,0),
                            new Attaque("Enorme coup",500,100,10,5)};*/
        Personnage* joueur;
        //joueur = new Personnage("Personnage",1000,1000,200,200,50,attaque,4);
     
        //Chargement du jeu
        chargerJeu(joueur, &tour);
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Attaque* attaque[]={new Attaque(),
                            new Attaque("Gros coup",150,20,2,0),
                            new Attaque("Assez gros coup",300,50,5,0),
                            new Attaque("Enorme coup",500,100,10,5)};
        Personnage* joueur;
    joueur = new Personnage("Personnage",1000,1000,200,200,50,attaque,4);
     
        //Chargement du jeu
        //chargerJeu(joueur, &tour);
    vous pourrez voir que le jeu fonctionne (noramalement).

    Mon code étant composé de plusieurs fichier je l'ai mit en pièce jointe en tar.gz
    Après l'avoir téléchargé il vous suffit de le décomprésser, de faire make et de le lancer avec ./fighter

    J'ai déjà chercher sur internet mais il y a pas l'aire d'avoir de personne avec le même problème ou j'utilise les mauvais mots clef peut-être.
    Merci d'avance à la personnage qui aura le courage de comprendre ce que j'ai fait et de trouver mon(mes) erreur(s) °-°
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Avec les bons warnings de compilation, l'erreur est évidente. Sur ce dépôt se trouve des options pour gcc et clang par version de compilateur. L'idéal étant de prendre un *-debug_full_broken_abi pour le débug et toujours utiliser un fichier *-warnings. La compilation se fait avec g++ @le-fichier-choisie ...reste des options... (@ pour que le compilateur lise chaque ligne du fichier comme option de compilation).

    Ensuite, le gros problème de ton code (je ne l'ai pas regardé, juste ce que tu as posté dans ton message) est l'utilisation à tort et à travers des pointeurs et de l'allocation dynamique. Il n'y a pas de raison que Attaque soit alloué dynamiquement par exemple. Je pense que Personnage est dans la même situation. Dans tous les cas, utilisation des pointeurs nus est source de problème. Il faut toujours privilégier les pointeurs intelligents tel que std::unique_ptr.

    Pour le Makefile, en C++ on utilise les variables préfixés de CXX, et non C qui font référence au langage C.

    Code Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CXX = g++
    CXXFLAGS = # ici mettre l'option @fichier
    CPPFLAGS = # CPP pour C-PreProcessor pour -I et -D
    SRC = $(wildcard *.cpp)
    O_FILES = $(SRC:.cpp=.o)
     
    fighter: $(O_FILES)
            $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $^ # je pense optionnel s'il y a un CC=$(CXX)
     
    # ...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut
    Merci pour ta réponse
    Je programme en faisant un mélange de java et de C donc je ne sais pas si c'est très bien ^^
    Tu me dis que l'utilisation de Personnage alloué dynamiquement n'est pas top. Mais le problème c'est que je le crée dans une fonction, ce qui fait que je dois retourner une adresse alloué dans le tas pour que je puisse garder les données. Enfin pour attaque je ne sais pas combien d'attaque aura mon personnage, je le lis seulement dans le fichier

    Je n'arrive pas à utiliser les options pour le compilateur que tu m'as conseillé °-°

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    En ayant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Personnage* joueur;
    chargerJeu( joueur, &tour );
    Avec une fonction définie comme void chargerJeu( Personnage* joueur, int* tour );; donc passage d'une variable non initialisée (en plus c'est un pointeur!) le code ne va pas aller bien loin. Avec en plus des new dans le code, il doit y avoir d'autres erreurs. Et en effet le compilateur doit déjà émettre des warnings qui doivent tous être pris en compte.

    Partir d'un mélange de Java et de C, est surement la pire des bases pour travailler en C++. Il va te falloir t'appuyer sur un cours C++ robuste.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut
    Dalfab mon compilateur ne m'a dit aucune erreur et aucun warnings °-°

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pour préciser un peu la réponse de dalfab :

    Tu passes à ta fonction un pointeur par copie. Donc, dans la fonction tu assigne une nouvelle valeur à ce paramètre, mais ce paramètre n'a rien à voir avec la variable en dehors qui a servi à l'initialiser...

    https://cpp.developpez.com/faq/cpp/?...-a-ma-fonction
    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
     
    void f(Joueur *j)
    {
      j = new Joueur; // Ne modifie que le paramètre local
    }
     
    void g(Joueur *&j)
    {
      j = new Joueur; // Modifie la variable passée à la fonction
    }
     
    void h()
    {
      Joueur *j = nullptr;
      f(j); // j vaut toujours nullptr
      g(j); // j est modifié
    }
    Attention, le code comme g n'est pas un bon exemple à suivre, c'est juste pour expliquer ton problème.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par adjokaido Voir le message
    je dois retourner une adresse alloué dans le tas pour que je puisse garder les données.
    Si tu retournes vraiment une valeur, pourquoi la valeur de retour n'est pas utilisée/assignée ? C ou JAVA fonctionnent de la même manière là.
    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
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Par défaut
    Effectivement, je suis passé par une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Personnage* chargerPersonnage() {
    //Lecture dans le fichier
    return new Personnage(paramètre lu dans le fichier);
    }
    Et mon problème est résolu °-°

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pourquoi new ? Pourquoi un pointeur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Personnage chargerPersonnage() {
    //Lecture dans le fichier
    return Personnage(paramètre lu dans le fichier);
    }
    Il peut y avoir de bonnes réponses à mes questions qui justifient un pointeur (intelligent, mais je ne pense pas que tu aies déjà vu ça), mais par défaut, on devrait manipuler les objets directement, et réserver les pointeurs aux cas où ils sont justifiés.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. [2.x] Perte inexpliquée de méthode sur objet
    Par Phobizeur dans le forum Symfony
    Réponses: 1
    Dernier message: 02/10/2015, 19h08
  2. gestion des évènements sur objets dynamiques
    Par boss_gama dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/03/2009, 11h50
  3. Utiliser une CssClass sur objet dynamique
    Par starkson dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/07/2007, 09h54
  4. [IE vs FF] getElementsByName sur objet dynamique
    Par TSalm dans le forum Général JavaScript
    Réponses: 29
    Dernier message: 01/03/2007, 18h48
  5. Evenement sur objet dynamique
    Par CanardJM dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 19/11/2004, 13h56

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