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 :

Récupérer les élements d'une structure ...


Sujet :

GTK+ avec C & C++

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Récupérer les élements d'une structure ...
    Bonjour,

    J'ai créé une structure, dont j'alloue dynamiquement un pointeur.
    Cette structure, je la place dans une GList, mais apres, je n'arrive pas à acceder à un élement de mon pointeur (qui est la structure mentionnée plus haut) à partir de la GList !

    Bon, grossièrement :

    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
    typedef struct
    {
       GtkWidget *p_tab_label;
     
       GtkWidget *p_scrollbar;
       GtkWidget *p_scrollbar_2;
     
       GtkWidget *p_text_view;
     
       GtkWidget *p_list_view;
       GtkListStore *p_list_store;
       GtkTreeViewColumn *p_column;
       GtkCellRenderer *p_renderer;
     
       GtkWidget *p_hpaned;
    }
    _tab_chan_s;
     
    _tab_chan_s *p_tab_chan_s;
    Je vous passe l'allocation en memoire
    Voici ma fonction (qui n'est pas finie):

    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
    void cb_send_message (GtkWidget *p_widget, gpointer p_data)
    {
       const gchar *p_msg = NULL;
       gint current_page = 0;
       GtkTextBuffer *p_buffer = NULL;
       GtkTextIter i_end;
       gpointer p_st_data = NULL;
     
     
       /* Recupere le texte contenu dans la zone de saisie */
       p_msg = gtk_entry_get_text (GTK_ENTRY (main_win_s->p_entry));
     
       /* Si le tampon est vide alors la zone est vide. Affichage d'un
          message d'information */
       if (strcmp (p_msg, EMPTY_LINE) == 0)
       {
          dlg_show_message (
             GTK_WINDOW (main_win_s->p_window),
             GTK_MESSAGE_INFO,
             GTK_BUTTONS_OK,
             "La zone de saisie est vide !");
       }
       else
       {
          /* Recupere la page courrante */
          current_page = gtk_notebook_get_current_page (
                            GTK_NOTEBOOK (main_win_s->p_notebook));
     
     
          p_st_data = g_list_nth_data (p_tab_chan_list, current_page);
     
          p_buffer = gtk_text_view_get_buffer ((_tab_chan_s)p_st_data->p_text_view);
       }
    }
    mais je n'arrive pas a acceder aux widgets contenu dans ma structure ajoutée ainsi dans la GList:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_list_append (p_tab_chan_list, p_tab_chan_s);
    J'ai ceci en message d'erreur:

    107 C:\Documents and Settings\CSoldier\Mes documents\Sauvegardes\Programmation\MOPIC\mopic_callback.c [Warning] dereferencing `void *' pointer
    107 C:\Documents and Settings\CSoldier\Mes documents\Sauvegardes\Programmation\MOPIC\mopic_callback.c request for member `p_text_view' in something not a structure or union
    Voilà toute l'histoire, si quelqu'un pouvait me mettre sur la voie ce serait super !

    Merci d'avance
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [GTK] Récupérer les élements d'une structure ...
    Citation Envoyé par CSoldier
    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
    void cb_send_message (GtkWidget *p_widget, gpointer p_data)
    {
       const gchar *p_msg = NULL;
       gint current_page = 0;
       GtkTextBuffer *p_buffer = NULL;
       GtkTextIter i_end;
       gpointer p_st_data = NULL;
     
     
       /* Recupere le texte contenu dans la zone de saisie */
       p_msg = gtk_entry_get_text (GTK_ENTRY (main_win_s->p_entry));
     
       /* Si le tampon est vide alors la zone est vide. Affichage d'un
          message d'information */
       if (strcmp (p_msg, EMPTY_LINE) == 0)
       {
          dlg_show_message (
             GTK_WINDOW (main_win_s->p_window),
             GTK_MESSAGE_INFO,
             GTK_BUTTONS_OK,
             "La zone de saisie est vide !");
       }
       else
       {
          /* Recupere la page courrante */
          current_page = gtk_notebook_get_current_page (
                            GTK_NOTEBOOK (main_win_s->p_notebook));
     
     
          p_st_data = g_list_nth_data (p_tab_chan_list, current_page);
     
          p_buffer = gtk_text_view_get_buffer ((_tab_chan_s)p_st_data->p_text_view);
       }
    }
    mais je n'arrive pas a acceder aux widgets contenu dans ma structure ajoutée ainsi dans la GList:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_list_append (p_tab_chan_list, p_tab_chan_s);
    J'ai ceci en message d'erreur:

    107 C:\Documents and Settings\CSoldier\Mes documents\Sauvegardes\Programmation\MOPIC\mopic_callback.c [Warning] dereferencing `void *' pointer
    107 C:\Documents and Settings\CSoldier\Mes documents\Sauvegardes\Programmation\MOPIC\mopic_callback.c request for member `p_text_view' in something not a structure or union
    Voilà toute l'histoire, si quelqu'un pouvait me mettre sur la voie ce serait super !
    Le principe général pour récupérer des données à partir d'un pointeur anonyme (pour cause de callback, par exemple...) est de caster dans le bon type ou d'utiliser un pointeur local du bon type.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void f (void *p)
    {
       printf ("n = %d\n", *((int*)p)); /* horrible! */ 
     
       /* ou */
     
       int *pi = p;
     
       if (pi != NULL)
       {
          printf ("n = %d\n", *pi);
       }
    }
    Evidemment c'est au programmeur de savoir le type de la variable dont il a passé l'adresse à la fonction qui appellera un jour le callback. C'est du 'sans filet', et il vaut mieux être réveillé.

    Détails sur les callbacks avec variable anonyme ici :

    http://emmanuel-delahaye.developpez.com/complog.htm

    (GTK est un exemple parfait de composant logiciel).
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ca marche au poil ! Je te remercie pour cette info, la prochaine fois je vais directement voir ton site
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par CSoldier
    Ca marche au poil ! Je te remercie pour cette info, la prochaine fois je vais directement voir ton site
    Je suis quand même un peu étonné. Tu n'avais jamais utilisé qsort() ?
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Heu pourquoi tu me parles de qsort ? Je ne vois pas le rapport ! Mais sinon, bah non, je n'ai pas vraiment utilisé cette fonction, sauf peut etre à mes début en C !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par CSoldier
    Heu pourquoi tu me parles de qsort ? Je ne vois pas le rapport !
    Parce que avec qsort(), on a un magnifique callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int mycompare(void const *pa, void const *pb);
    qui oblige déjà au genre de gymnastique exposé ci-dessus... Normalement, si on connait le C, on connait déjà ces manips !
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ha ok, non moi les callback j'ai directement commencé avec GTK en fait !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. Erreur à l'appel d'un élement d'une structure
    Par diego45 dans le forum MATLAB
    Réponses: 1
    Dernier message: 25/09/2014, 11h42
  2. Réponses: 2
    Dernier message: 03/07/2014, 13h06
  3. Adresse d'un élement d'une structure
    Par edgarjacobs dans le forum C
    Réponses: 6
    Dernier message: 18/12/2011, 19h01
  4. récupérer les élements d'une liste (<select>)
    Par ferrero dans le forum Struts 1
    Réponses: 4
    Dernier message: 12/06/2007, 13h55
  5. Réponses: 5
    Dernier message: 01/03/2006, 11h34

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