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

GTK+ avec C & C++ Discussion :

Afficher une liste chainée dans un text_view


Sujet :

GTK+ avec C & C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Afficher une liste chainée dans un text_view
    Bonsoir,

    Je me suis mis récemment au GTK+ et je rencontre quelques difficultés.
    En effet, la création de l'interface et l'implémentation du code se sont déroulés sans gros problèmes, mais je peine à afficher mes résultats dans ma zone de texte. Mes données sont contenues dans une liste chainée et je ne parviens qu'à les afficher dans la console.
    Quelqu'un pourrait-il me donner une méthode pour faire cet affichage dans la zone de texte?

    Merci d'avance pour votre aide.

    Gaara93

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Si c'est le parcours de la liste chaîné que tu n'arrives pas à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    GList *it;
     
    for (it = ma_liste_chainee; it != NULL; it = it->next) {
           MesDonnes *donnees = (MesDonnees *)it->data;
     
           afficher_donnees_dans_zone_de_texte (zone_de_texte, donnees);
    }
    Si c'est l'affichage proprement dit que tu n'arrives pas à faire, il faudrait donner plus d'infos sur le widget que tu utilises et sur la façon dont tes données sont stockées dans ta liste chaînée.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Le parcours de liste est déjà fait, enfin si celui si est le même que dans le code C... (mais d'après ce que tu m'as donné ça n'a pas l'air d'être le cas )

    Donc voici le widget que j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GtkWidget *ecran;
    ecran=gtk_text_view_new();
    gtk_text_view_set_wrap_mode (ecran, GTK_WRAP_CHAR);
    Et la structure contenant ma liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct Cell // Structure d'une liste chaînée
    {
        int donnee; // donnée de type entier uniquement
        struct Cell *suivant;
        struct Cell *precedent;
     
    }Cell;
    Je souhaite te remercier aussi de t'arrêter sur mon problème qui n'est pas forcément des plus intéressant

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Pour ta liste chaînée, tu peux utiliser le type GList au lieu de refaire ta propre implémentation à la main Ce que tu n'arrives pas à faire, c'est insérer du texte dans ton GtkTextView ou bien c'est convertir ta donnée entière (de type int) en texte que tu peux afficher dans le GtkTextView ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    En fait tout le programme est basé sur mes listes de type Cell.
    Je pensais simplement recopier mon résultat dans une de type GList avant de l'afficher afin de ne pas avoir à modifier tout mon code (il me faudrait des jours dans ce cas )

    La conversion en caractère n'est pas un soucis, c'est réellement l'affichage en lui même le problème, je ne sais pas quelles fonctions utiliser et encore moins comment les utiliser.

    Merci de votre aide

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Je pense pas que tu aies besoin de tout convertir en GList tant que tu sais itérer sur ton type Cell.
    Tu peux utiliser http://library.gnome.org/devel/gtk/s...iew-get-buffer et http://library.gnome.org/devel/gtk/s...sert-at-cursor pour afficher un char * dans un GtkTextView

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci pour ces sources, mais je ne sais pas comment utiliser ces fonctions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkTextBuffer *     gtk_text_view_get_buffer     (GtkTextView *text_view);
    Je n'arrive pas à définir une variable de type GtkTextBuffer, et *text_view correspond donc bien à ma zone de texte?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void  gtk_text_buffer_insert_at_cursor    (GtkTextBuffer *buffer, const gchar *text, gint len);
    Ici il suffit donc de passer en paramètres le buffer obtenu avec la fonction précédente, le caractère obtenu après la conversion de chaque donnée et enfin la valeur 1 car on n'affiche uniquement un caractère à la fois?

    Je m'excuse d'en demander autant mais ces fonctions sont totalement inconnues pour moi qui n'ai jamais eu de cours en GTK, et encore une fois merci car j'ai vraiment l'impression de toucher au but

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    La première fonction te permet de récupérer un GtkTextBuffer à partir du GtkTextView que tu as à ta disposition effectivement. La seconde insère du texte, je pense que -1 doit être valide pour le dernier argument (ça indique que ta chaîne est une chaîne C standard qui se termine par un \0). Si tu n'obtiens qu'un unique caractère après avoir "interprété" tes données, tu peux effectivement passer 1 comme valeur. Fais gaffe, la fonction prend un argument de type char *, pas char.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci!

    Tu m'aides vraiment mais j'ai un soucis au niveau de cette ligne:
    Le compilateur m'affiche une erreur de syntaxe.

    Lorsque j'utilise cette fonction, faut-il stocker le buffer de cette manière?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buffer = gtk_text_view_get_buffer(ecran);
    EDIT: Je m'en suis sorti au niveau de la création du Buffer, maintenant j'ai une erreur au niveau de l'argument de gtk_text_view_get_buffer...

    EDIT 2:
    J'ai réussi à faire une boucle qui selon moi aurait dû afficher... mais le compilateur n'est pas du même avis
    Voici mon code:
    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
    void affichage_ecran(Global* Tout)
    {
        GList *premier = NULL; //On définit une liste en GTK
        char* chiffre = NULL;
        GtkTextBuffer *buffer;
        chiffre = malloc(sizeof (char));
     
        for (premier = Tout->rp_L.debut; premier != NULL; premier = premier->next)
        {
                premier->data = Tout->rp_L.debut->donnee;
     
                buffer = gtk_text_view_get_buffer(ecran);
     
                *chiffre = (premier->data) + 48;
                //*chiffre = (Tout->rp_L1.debut->donnee) + 48;
     
                gtk_text_buffer_insert_at_cursor(buffer, *chiffre, -1);
     
                Tout->rp_L1.debut = Tout->rp_L1.debut->suivant;
        }
    }
    EDIT 3:
    C'est bon j'ai réussi! Je te remercie encore une fois!
    Le résultat est parfait

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Le résultat est parfait avec le code que tu as posté ? Ou avec une version différente ? Tu peux poster la version finale au cas où qqu'un aurait les mêmes soucis que toi ?

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Aucun soucis le voici:

    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
        for (premier.rp_L.debut = Tout->rp_L.debut; premier.rp_L.debut != NULL; premier.rp_L.debut = premier.rp_L.debut->suivant)
        {
                premier.rp_L.debut->donnee = Tout->rp_L.debut->donnee;
     
                /* Recuperation du buffer */
                buffer = gtk_text_view_get_buffer(ecran);
     
                /* passage de l'entier au code ASCII */
                *chiffre = (premier.rp_L.debut->donnee) + 48; 
     
                /* affichage */
                gtk_text_buffer_insert_at_cursor(buffer, chiffre, -1);
     
                Tout->rp_L.debut = Tout->rp_L.debut->suivant;
        }

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Ton *chiffre et le -1 que tu passes à gtk_text_buffer_insert m'inquiètent un peu, je ne suis pas sûr que tu écrives dans une zone mémoire valide, et vu que tu travailles juste avec un caractère, il n'y aura pas de caractère \0 après (du moins c'est pas garanti)

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Eh bien tu as peut-être raison...
    Mais cette fonction répond totalement à mes attentes, et malheureusement je n'ai pour l'instant pas le temps de l'améliorer désolé ^^

  14. #14
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Libre à toi, on en reparlera plus tard de cette fonction qui suffit pour l'instant, par exemple quand des plantages mystérieux se produiront à des moments aléatoires lors de l'utilisation de ton appli.

Discussions similaires

  1. Afficher une List<Object[]> dans une page JSP
    Par patricx dans le forum Spring Web
    Réponses: 8
    Dernier message: 24/05/2013, 13h51
  2. Réponses: 5
    Dernier message: 25/04/2006, 09h33
  3. enregistrer une liste chainée dans un fichier?
    Par ALF-Teams dans le forum C
    Réponses: 7
    Dernier message: 08/03/2006, 18h42
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  5. [Stratégie]Sauvegarde d'une liste chainée dans un fichier
    Par BernardT dans le forum Général Java
    Réponses: 17
    Dernier message: 25/07/2005, 17h04

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