Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probléme de segmentation avec retour de fonction

Probléme de segmentation avec retour de fonction

    21 septembre 2017 à 15:50:40

    Bonjour,

    Je recherche depuis presque une bonne demi-heure de ou viens mon soucis, j'ai fais pas mal de tests mais impossible de trouver de ou viens mon erreur.

    J'ai une fonction qui affiche un menu, et elle me retour un int en fonction de se que l’utilisateur veut afficher.

    Le menu déroulant fonctionne à la perfection, mais une fois que l'utilisateur utilise la touche 'e' pour valider sont choix, la fonction me retourne une erreur de segmentation.

    La chose bizarre, c'est qu'il y a une erreur de segmentation seulement au moment ou je fais un return de ma variable choix. Avant ça, dans a fonction, cela marche parfaitement.

    Voici mon code:

    #include <ncurses.h>
    #include <array>
    #include <string>
    
    void init(){
        initscr(); // Lance ncurses
        noecho(); // N'affiche pas les appuies des touches
        keypad(stdscr, true); // Detecte tout le clavier
        cbreak(); // Pas d'enrengistrements dans le buffer
        nodelay(stdscr, true); // Pas d'attente aux getch();
        curs_set(0); // On n'affiche pas le curseur
    }
    
    int Menu(){
        bool inMenu{true};
        int choix{0};
        std::string texteMenu[3] = {"Jouer\n", "Credit\n", "Quitter\n"};
    
        while(inMenu){
            printw("Appuyer sur 'e' pour selectionner\n\n");
    
            for(int i{0}; i <= 2; ++i){
                if(choix==i){
                    attron(A_UNDERLINE); // Surligne le texte qui suit
                }
                printw(texteMenu[i].c_str());
                attroff(A_UNDERLINE); // Retire le surlignement
            }
    
            switch(getch()){
                case KEY_UP:
                    --choix;
                    if(choix<0){choix=2;}
                    break;
                case(KEY_DOWN):
                    ++choix;
                    if(choix>2){choix=0;}
                    break;
                case 'e':
                    inMenu = false;
                    break;
                default:
                    break;
            }
    
            refresh();
            clear();
        }
    
        return choix;
    }
    
    int main()
    {
        init();
    
        int i{0};
    
        i = Menu();
        clear();
        printw("%n", i); /// Erreur de segmentation
    
        refresh(); // On affiche
        getch(); // Pause
        endwin(); // Fin de ncurses
        return 0;
    }
    

    J'utilise Ncurses au passage, mais je pense que vous l'aurez vue :)

    Voici un screen de mon ecran:

    Avant validation:

    Après que la touche 'e' soit enfoncé.

    Je vous remercie d'avance!

    -
    Edité par 238 21 septembre 2017 à 15:53:31

    • Partager sur Facebook
    • Partager sur Twitter
      21 septembre 2017 à 16:43:54

      Tu sais ce que fait %n avec un printw/printf ?

      Je pense aussi que tu n'actives pas suffisamment de warning, que tu les ignores ou que ton compilateur est mal configuré.

      • Partager sur Facebook
      • Partager sur Twitter
        21 septembre 2017 à 16:58:56

        Activer des warnings? Tu veux dire des tests voir si l'utilisateur ne fais pas n'importe quoi?

        Problème résolu au passage, erreur tellement idiote.. merci!

        • Partager sur Facebook
        • Partager sur Twitter
          22 septembre 2017 à 17:14:28

          > Activer des warnings? Tu veux dire des tests voir si l'utilisateur ne fais pas n'importe quoi?

          Non, demander au compilateur de faire des vérifications pour nous. En l’occurrence:

                  input_line_4:2:15: warning: format specifies type 'int *' but the argument has type 'int' [-Wformat]
                   printf("%n", i)
          

          Qui montre clairement un problème.

          Ici c'est pour printf, mais printw donne exactement la même chose.

          • Partager sur Facebook
          • Partager sur Twitter

          Probléme de segmentation avec retour de fonction

          × 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