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

Langage C++ Discussion :

[algo]coupure de mot, champ de texte


Sujet :

Langage C++

  1. #1
    Membre du Club
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Points : 45
    Points
    45
    Par défaut [algo]coupure de mot, champ de texte
    Salut ! Dans le cadre d'un projet sfml, je voudrais coder une classe champ de text (GLineText), j'ai commencé et je dois maintenant faire en sorte de ne pas afficher les premières lettres quand il y en a trop, mais ça coince ! voici en gros ce que je veux faire :

    Je récupère à chaque appuis de touche un sf::Uint32 que je met dans
    std::deque<sf::Uint32> contenu_entier
    j'appel ensuite dessus la méthode analyser(std::deque<sf::Uint32> &tab) dans laquelle :
    - je copie le tableau deque donné en param dans un std::deque<sf::Uint32> contenu_af; (contenu affichable)
    - je compte le nombre de lettre
    - si il y en a plus de 8
    -> je calcul le nombre de lettre en trop
    -> je prend la première lettre de contenu_af et je la met dans un std::deque<sf::Uint32> reserve_lettre;
    -> je supprime la première lettre de contenu_af
    -> je répète ces dernières instructions autant de fois qu'il y a de lettre en trop

    je place ensuite le contenu de contenu_sf dans un std::basic_string<sf::Uint32> str;, cette variable sera mi en paramètre d'une fonction de dessin de text propre à la sfml.

    Voici mon code commenté et racourci :
    GLineText.h
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #ifndef DEF_GLINETEXT
    #define DEF_GLINETEXT
     
    #include <SFML/Graphics.hpp>
    #include <string>
    #include <deque>
     
    /*
    Class GLineText
    Champ de text SFML
    par guidono
    */
     
    class GLineText {
        public:
            GLineText(sf::RenderWindow *app, float X, float Y, sf::Color &colorFond, sf::Color &borderColor);
            ~GLineText();
            void ecouter_sourie(sf::Event &event);
            void ecouter_sourie(sf::Event &event, std::deque<GLineText*> tab_g_line_text);
            void ecouter_clavier(sf::Event &event);
     
            //ces deux méthodes sont importantes pour ce que je veux faire
            void insertText(sf::Uint32 &t);
            void analyser(std::deque<sf::Uint32> &tab); 
     
            //bon je met pas tout
     
        private:
            //blablabla
     
            sf::String contenu; //contenu qui sera affiché
            std::basic_string<sf::Uint32> str; 
            std::deque<sf::Uint32> reserve_lettre; //pour les lettres en trop
            std::deque<sf::Uint32> contenu_entier; //le contenu de départ
            std::deque<sf::Uint32> contenu_af; //contenu que l'on voudra afficher avec les lettres en moins
     
            //blablabla
    };
    #endif
    GLineText.cpp
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    void GLineText::ecouter_clavier(sf::Event &event) {
        if(event.Type == sf::Event::TextEntered) {
            if(is_use) {insertText(event.Text.Unicode);} //si il y a le focus, on insert le texte entré
        }
    }
    void GLineText::insertText(sf::Uint32 &t) {
     
        contenu_entier.push_back(t); 
        analyser(contenu_entier); //on analyse
     
        std::cout << "[taille] contenu_af :" << contenu_af.size() << std::endl; //je vois ici taille = 0...bizzar
        for(int i = 0; i < contenu_af.size(); i++) { //avec taille = 0 str ne se remplit pas...
            str += contenu_af[i];
        }
     
        contenu.SetText(str);
        contenu.SetSize(15);
        contenu.SetX(posX + espace_x + text.GetRect().GetWidth() + 7);
        contenu.SetY(posY-1);
     
    }
    void GLineText::analyser(std::deque<sf::Uint32> &tab) {
     
        int nbr_lettre = 0; //pour compter le nombre de lettres
        for(int i = 0; i < tab.size(); i++) {
            contenu_af[i] = tab[i]; //on copie le tableau entier dans le tableau qu'on modifira
            nbr_lettre++;
        }
     
        if(nbr_lettre > 8) { //si il y a trop de lettre
            int en_trop = nbr_lettre - 8; //on calcul le nombre de lettre en trop
     
            for(int i = 0; i < en_trop; i++) {
                reserve_lettre.push_front(contenu_af.front()); //on prend la 1er lettre en trop et on la met dans le tableau de reserve de lettre
                contenu_af.pop_front(); //on supprime la 1er lettre
            }
        }
     
    }
    voilà j'espère que vous pourrez m'aider...je bloque
    pour info après 8 ou 9 entré de lettre, segmentation fault !
    ps : je suis sous linux

    merci d'avance !!

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Je n'ai pas encore lu le code, mais à vrai dire je ne comprends pas l'énoncé du problème...
    Supposons que les lettres '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B' et 'C' arrivent une par une dans cet ordre. Tu dois afficher quoi, quand et comment ?

  3. #3
    Membre du Club
    Developpeur C
    Inscrit en
    Octobre 2009
    Messages
    48
    Détails du profil
    Informations professionnelles :
    Activité : Developpeur C

    Informations forums :
    Inscription : Octobre 2009
    Messages : 48
    Points : 45
    Points
    45
    Par défaut
    Pour tes questions :je veux afficher les lettres entrées au clavier au moment où elles sont entrées, le rôle d'un champ de texte !

    Peut-être n'ai-je pas asses expliqué ou mal ?
    Quand une lettre arrive, elle est ajouter dans contenu_entier grace à la méthode push_back(t);
    On a ensuite deux autre deque, un pour stocker les lettres en trop que l'on ne doit pas afficher (reserve_lettre) et un tableau contenant l'ensemble des lettres à afficher (contenu_af).
    La methode analyse s'occupe de mettre les lettres là ou il faut.

    Je prend ensuite le contenu à afficher (contenu_af) et je le met dans un
    std::basic_string<sf::Uint32> str;

    et je vais pouvoir mettre cette dernière en paramètre d'une string propre à la sfml permettant de dessiner les lettres à l'écran.

    Les problèmes sont les suivant : les lettres ne s'affiche plus depuis que j'essaye de cacher les premières lettres une fois le nombre limite de lettre atteint. Et après avoir tapé 8 ou 9 lettres (la limite, comme on peut le voir dans la fonction analyser), il y a un segmentation fault.
    De plus quand je veux afficher à des moments différent la taille de contenu_af, il me met 0 à chaque fois...

    voilà j'espère avoir été plus clair !

Discussions similaires

  1. Colorer chaque mot par une couleur differente dans un champ de texte
    Par Mettali hedi dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/01/2007, 13h20
  2. Réponses: 3
    Dernier message: 25/02/2005, 20h46
  3. Récupérer le texte d'un champ de texte
    Par theberliner dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 04/12/2004, 10h08
  4. Problème de contrôle de champ input texte
    Par NATHW dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/10/2004, 22h48
  5. [access] champs type text sur un pc blob sur un autre
    Par Harry dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/07/2004, 09h30

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