Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème de segmentation fault avec les tableaux

Quel débuggeur utiliser sous mac ?

Sujet résolu
    18 mars 2008 à 15:07:22

    Bonjour chers zéros !

    J'ai un léger problème :p
    Regardez par vous-même :-°

    Que veux-tu faire ? (choix : attaquer - boirePotionDeVie - changerArme)
    changerArme
    Quelle arme voulez-vous prendre ? 
      0. Epée rouillée
      1. Epée aiguisée
      2. Epée batarde à 2 mains
      3. Glaive de Vercingétorix
      4. Lance de chevalier
      5. Trident de Poséidon
      6. Le canif de Dieu
      7. A
      8. ???
    Segmentation fault



    Donc voilà, j'utilise vim sous mac, et je compile de la sorte :

    fandekasp$ c++ main.cpp Personnage.cpp Arme.cpp


    En faisant des recherches, j'ai cru comprendre qu'on utilisait gdb comme débuggeur (mais ces mêmes personnes compilaient avec gcc, alors je ne sais pas si je peux aussi utiliser gdb.. excusez le zéro qui domine en moi, j'ai un peu de mal avec tout ça :( ) . C'est pourquoi je viens humblement demander votre avis, que pourrais-je utiliser pour m'en sortir tout seul pour corriger mes erreurs ? merci beaucoup :)


    Sinon, voilà le code spécifique à l'origine de l'erreur... Ne connaissant pas grand chose des tableaux en C++, j'imagine que l'erreur va vous sauter aux yeux looool.

    main.cpp

    1. // ...
    2. do
    3. {
    4.       // initialisation de mon tableau de strings
    5.       string tableauArmes[] = {"Epée rouillée", "Epée aiguisée",
    6.                                "Epée batarde à 2 mains", "Glaive de Vercingétorix",
    7.                                "Lance de chevalier", "Trident de Poséidon",
    8.                                "Le canif de Dieu"};
    9.       cout << "Que veux-tu faire ? (choix : attaquer - boirePotionDeVie -
    10.               changerArme)" << endl;
    11.       string choixTour;
    12.       getline(cin, choixTour);
    13.       // ...
    14.       else if (choixTour == "changerArme")
    15.       {
    16.             cout << "Quelle arme voulez-vous prendre ? " << endl;
    17.             // On fait une boucle de tous les éléments du tableau et on les affiche
    18.             for (int i = 0; i<sizeof(tableauArmes); i++)
    19.             {
    20.                   cout << "  " << i << ". " << tableauArmes[i] << endl;
    21.             }
    22.             string nomArme;
    23.             getline (cin, nomArme);
    24.             // ...




    Merci beaucoup pour le temps que vous aurez passé pour moi :)
    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2008 à 15:12:23

      fais:
      1. std::cout << sizeof(TableauArmes) << std::endl;

      et tu verras tout de suite que tu ne peux pas faire comme ca

      utilise std::vector
      • Partager sur Facebook
      • Partager sur Twitter
        18 mars 2008 à 15:14:01

        sizeof(tableauArmes) c'est le nombres de bytes de ton tableau et pas le nombre d'elements qu'il contient.

        Tu ne peux pas connaitre a l'execution le nombre d'éléments d'un truc[].
        Je te conseille grandement d'utiliser std::vector<std::string> a la place.

        sinon tu définit une CONSTANTE préprocesseur qui vaut le nombre d'armes que tu as défini.
        1. #define CONSTANTE_N 7


        1. string tableauArmes[CONSTANTE_N] = {"Epée rouillée", "Epée aiguisée",
        2. "Epée batarde à 2 mains", "Glaive de Vercingétorix",
        3. "Lance de chevalier", "Trident de Poséidon",
        4.  "Le canif de Dieu"};


        puis dans ta boucle tu fais:
        1. for(i=0;i<CONSTANTE_N;++i){/*bla bla ...*/}
        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2008 à 15:33:55

          Citation : ledemonboiteux


          1. #define CONSTANTE_N 7


          Il est temps de passer au "++"
          1. const int CONSTANTE_N = 7;


          1) Typé
          2) Appartient à un espace de nom
          3) Le compilateur peut s'apercevoir d'une ambiguïté entre 2 entités du même nom.
          • Partager sur Facebook
          • Partager sur Twitter
            18 mars 2008 à 16:04:49

            Citation : ledemonboiteux

            a- sizeof(tableauArmes) c'est le nombres de bytes de ton tableau et pas le nombre d'elements qu'il contient.

            b- Tu ne peux pas connaitre a l'execution le nombre d'éléments d'un truc[].
            c- Je te conseille grandement d'utiliser std::vector<std::string> a la place.

            d- sinon tu définit une CONSTANTE préprocesseur qui vaut le nombre d'armes que tu as défini.

            1. #define CONSTANTE_N 7
            2. string tab[CONSTANTE_N] = { ...}

            a- C'est vrai

            b- c'est faux, avec les tableaux statiques, on peut le savoir
            cf p.ex. http://hermitte.free.fr/Info/C++/libs/luc_lib/array_help.hpp (oubliez le pdf dans cette zone du site, il est mauvais)

            c- au détail de l'initialisation si on veut coder le biniou en dur ... vector sera effectivement mieux pour des vraies solutions (où tout sera lu depuis un fichier p.ex.)

            d- Cette solution n'en est pas une, si la constante déclarée diffère du nombre d'éléments effectivement déclarés, on va avoir des problèmes.
            Perso, j'ai plutôt tendance à post-initialiser la constante avec:
            1. std::string tab[] = { ....} ;
            2. const size_t N = array_size(tab);
            • Partager sur Facebook
            • Partager sur Twitter
            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
              19 mars 2008 à 9:41:48

              Imghs, merci pour tes remarques, je ne conaissais pas la méthode en particulier array_size(...)

              Mattex, oui les const c'est mieux que les directives prepross.
              • Partager sur Facebook
              • Partager sur Twitter

              problème de segmentation fault avec les tableaux

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown