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 :

Problème avec les GList


Sujet :

GTK+ avec C & C++

Vue hybride

Kicker Problème avec les GList 29/03/2008, 22h51
teuf13 Faudrait que tu détailles... 30/03/2008, 00h09
Kicker Absolument ! Voici mon code :... 30/03/2008, 11h51
gerald3d A quoi te sert cette... 30/03/2008, 13h58
Kicker Bon voilà le code presque... 30/03/2008, 14h19
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut Problème avec les GList
    J'ai un problème avec les GList.
    j'essaye de faire une GList dans laquelle je peux placer des GtkTextView et les reprendre dans d'autres fonctions...
    Oui mais voilà : Ils disparaissent ! Je fais un g_list_append dans une fonction, je m'en sers sans problème, et quand je réutilise ce pointeur dans une autre fonction, y a plus rien ! Pouf ! Envolé ! Et le pointeur est à NULL !!
    Quelqu'un peut m'expliquer à quoi sert une GList qui ne garde pas les élements en mémoire ? et surtout comment je peux faire... :-/

  2. #2
    Membre Expert
    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
    Par défaut
    Faudrait que tu détailles plus ce que tu fais... Ca ressemble fortement à un bug dans ton code Tu es sûr de faire blah = g_list_append (blah, ...); ? Sans l'affectation, ça ne marchera pas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Absolument ! 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
    22
    23
    void rediger(GtkWidget *pWindow, gpointer data)
    {
        Inf* in = data;
        GString* titre;
     
        in->txtview = gtk_text_view_new();
     
     
        in->liste = g_list_append(in->liste, in->txtview);
    /*data est une structure contenant un GList* dont la mémoire a été allouée dans le main*/
     
    ...
     
    ...
     
        gtk_container_add(GTK_CONTAINER(in->frameu), in->defile);
        gtk_container_add(GTK_CONTAINER(in->defile), in->liste->data);
    /*frame est une GtkFrame qui contient defile, une GtkScrolledWindow.*/   
     
        in->liste = in->liste->next;
    /*Ensuite, je passe à l'élément suivant dans la liste*/
    ...
    ...
    Ce code marche car quand je crée une nouvelle page à mon GtkNotebook, un nouveau GtkTextView apparait bien et je peux écrire dedans sans problème !

    Seulement voilà, lorsque je veux récupérer les GtkTextView (l'idée est de prendre le numéro n de la page courante et de récupérer le nième élément de la GList), elle est vide !

    Merci d'avance

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Kicker Voir le message
    Absolument ! Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void rediger(GtkWidget *pWindow, gpointer data)
    {
       ...
     
        in->liste = in->liste->next;
    /*Ensuite, je passe à l'élément suivant dans la liste*/
    ...
    ...
    A quoi te sert cette incrémentation sur l'élément suivant ? in->liste pointe sur le premier élément de ta liste orsque tu ajoute un nouvel élément, ce qui est le cas plus haut dans ton code. Donc normalement tu te retrouves à chaque fois sur le 2ème élément.

    A mon avis le problème se situe ici. Cette ligne me semble inutile et source de bug.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Bon voilà le code presque complet de la fonction pour qu'on comprenne bien :
    (les bouts de code en rapport avec la liste sont en gras)
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    void rediger(GtkWidget *pWindow, gpointer data)
    {
        Inf* in = data;
        GString* titre;
    
        in->txtview = gtk_text_view_new();
    
    /*Lors du 1er appel à la fonction. il n'y a qu'un seul GtkTextView, et pas de notebook*/
        if(!GTK_IS_WIDGET(in->winr))
        {
            in->vboxr3 = gtk_vbox_new(FALSE, 8);
            in->vboxr1 = gtk_vbox_new(FALSE, 8);
            in->winr = gtk_window_new(GTK_WINDOW_TOPLEVEL);
            gtk_widget_modify_bg (in->winr, GTK_STATE_NORMAL, &(in->color));
            gtk_window_set_title(GTK_WINDOW(in->winr), "Rediger un message");
            gtk_window_set_default_size(GTK_WINDOW(in->winr),300,600);
            gtk_window_set_position(GTK_WINDOW(in->winr), GTK_WIN_POS_CENTER);
            gtk_container_set_border_width (GTK_CONTAINER (in->winr), 8);
            gtk_window_set_transient_for(GTK_WINDOW(in->winr),GTK_WINDOW(in->wina));
            gtk_window_set_destroy_with_parent(GTK_WINDOW(in->winr),TRUE);
            gtk_container_add(GTK_CONTAINER(in->winr), in->vboxr1);
            in->narticles = 1;
            g_object_ref(in->vboxr3);
        }
    /*Au 2èmer appel à la fonction. il faut un 2ème GtkTextView, et on crée un notebook*/
        else if(!GTK_IS_WIDGET(in->notebook))
        {
            gtk_container_remove(GTK_CONTAINER(in->vboxr1),in->vboxr3);
            in->liste = in->liste->next;
            in->notebook = gtk_notebook_new();
            gtk_notebook_set_tab_pos(GTK_NOTEBOOK(in->notebook), GTK_POS_BOTTOM);
            gtk_notebook_set_scrollable(GTK_NOTEBOOK(in->notebook), TRUE);
            gtk_container_add(GTK_CONTAINER(in->vboxr1), in->notebook);
            gtk_notebook_append_page(GTK_NOTEBOOK(in->notebook),in->vboxr3, gtk_label_new("Article 1"));
            in->vboxr3 = gtk_vbox_new(FALSE, 8);
            gtk_notebook_append_page(GTK_NOTEBOOK(in->notebook),in->vboxr3, gtk_label_new("Article 2"));
            in->narticles = 2;
        }
        else
        {
    
            in->liste = in->liste->next;
            titre = g_string_new(NULL);
            g_string_sprintf(titre,"Article %d",in->narticles+1);
            in->narticles++;
            in->vboxr3 = gtk_vbox_new(FALSE, 8);
            gtk_notebook_append_page(GTK_NOTEBOOK(in->notebook),in->vboxr3, gtk_label_new(titre->str));
            g_string_free(titre, TRUE);
        }
    
        in->liste = g_list_append(in->liste, in->txtview);
    
        if(in->narticles==1)
        {
            ...
        
            //On créé la frame "Outils et tout ce qu'il y a dedans"  
        
            ...
    
        }
        in->hboxr2 = gtk_hbox_new(TRUE, 20);
        in->boutonrr = gtk_button_new_with_label("Annuler");
        g_signal_connect(G_OBJECT(in->boutonrr), "clicked", G_CALLBACK(annuler_article), data);
        in->boutonro = gtk_button_new_with_label("Envoyer");
        gtk_box_pack_end(GTK_BOX(in->vboxr3), in->hboxr2, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(in->hboxr2), in->boutonro, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(in->hboxr2), in->boutonrr, FALSE, FALSE, 0);
        in->frameu = gtk_frame_new("Article");
        in->entree_t = gtk_entry_new();
        gtk_entry_set_text(GTK_ENTRY(in->entree_t),"Titre");
        gtk_frame_set_shadow_type(GTK_FRAME(in->frameu), GTK_SHADOW_ETCHED_OUT);
        in->defile = gtk_scrolled_window_new(NULL, NULL);
        gtk_box_pack_start(GTK_BOX(in->vboxr3), in->entree_t, FALSE, TRUE, 5);
        gtk_box_pack_start(GTK_BOX(in->vboxr3), in->frameu, TRUE, TRUE, 5);
        gtk_container_add(GTK_CONTAINER(in->frameu), in->defile);
    //Ici, on utilise le dernier GtkTextView créé, d'où l'interet de faire in->liste = 
    //in->liste->next plus haut. Sinon il essaye d'ajouter le GtkTextView du 
    //premier appel, et non pas celui que j'viens de creer au début cet appel-ci...
        gtk_container_add(GTK_CONTAINER(in->defile), in->liste->data);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(in->defile),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
    
        gtk_widget_show_all(in->winr);
    }
    Voilà de quoi la fenêtre à l'air après avoir appelé cette fonction 4 fois de suite :


    Je veux bien enlever le in->liste = in->liste->next, mais dans ce cas qu'est-ce que j'dois mettre à la place de gtk_container_add(GTK_CONTAINER(in->defile), in->liste->data); pour être sûr de bien ajouter le dernier GtkTextView créé ??

    Merci d'avance

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    C'est bon j'ai résolu mon problème
    J'ai réussis à enlever le in->liste = in->liste->next en faisant ça :
    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 rediger(GtkWidget *pWindow, gpointer data)
    {
        ...
        GList* liste;
     
        in->txtview = gtk_text_view_new();
     
        ...
     
        in->liste = g_list_append(in->liste, in->txtview);
        liste = in->liste;
        while(liste->next!=NULL)
            liste = liste->next;
     
        ...
     
     
        gtk_container_add(GTK_CONTAINER(in->defile), liste->data);
     
        ...
    }
    Et ensuite quand je veux récupérer mes données ailleurs, je fais ça :

    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
    void format_texte(GtkWidget *pWidget, gpointer data)
    {
        Inf* in = data;
        GtkTextBuffer *pTextBuffer;
        GtkWidget *view;
        gint t;
     
        ...
     
        t = gtk_notebook_get_current_page(GTK_NOTEBOOK(in->notebook));
        view = g_list_nth_data(in->liste, t);
        pTextBuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
        gtk_text_buffer_insert_at_cursor(pTextBuffer,in->buf->str,-1);
     
        gtk_widget_destroy(in->winfo);
    }
    Et là il réécrit bien le texte formatté dans la page courante

    EDIT : Merci à gerald3d

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

Discussions similaires

  1. Problème avec les GList
    Par mick009 dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 09/07/2007, 09h40
  2. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par Invité dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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