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ération de pointeurs après la fonction g_signal_connect


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut Récupération de pointeurs après la fonction g_signal_connect
    Bonjour,

    et oui, j'ai encore un petit problème ! Je n'arrive pas à récupérer un pointeur qui fait parti d'un tableau de pointeurs après l'avoir passé en paramètre dans une fonction g_signal_connect. Pour être plus clair, voici le tableau que je déclare dans une de mes fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        GtkWidget* entry_musician_fname;
        GtkWidget* entry_musician_name;
        GtkWidget* entry_musician_style;
        ...
        GtkWidget* pointers[9] = {entry_musician_fname, entry_musician_name, entry_musician_style, entry_album_title, entry_album_producer, entry_album_date, entry_album_owned, entry_continent, entry_country};
    et voici ma fonction g_signal_connect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        g_signal_connect(G_OBJECT(button_init), "clicked", G_CALLBACK(search_init), pointers);
    J'essaye de récupérer mes pointeurs avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    static void search_init(GtkWidget *widget, gpointer pointers) {
        gtk_editable_delete_selection(((GtkEditable **)pointers)[0]);
    }
    Ceci ne marche pas car j'ai le message : Gtk-CRITICAL **: gtk_editable_delete_selection: assertion `GTK_IS_EDITABLE (editable)' failed.

    Donc je pense que je me suis trompé dans la façon de récupérer les pointeurs. Est-ce que quelqu'un pourrait me donner un coup de main ? D'autre part, est-ce qu'il serait possible de me dire si cette technique de passage de pointeurs par tableau (qui reste relativement propre) est efficace ou s'il y a mieux (puisque, à ma connaissance, il n'y a pas de fonction de recherche d'un widget parmi un widget de niveau plus élevé).

    Merci.

  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 ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkWidget* pointers[9];
    n'est pas déclaré dans la meme fonction que celle qui appelle gtk_main alors ce n'est pas surprenant que son contenu soit corrompu dans ton callback. En effet, c'est une variable locale, donc après que tu quittes la fonction où elle est déclarée, son contenu n'est plus valide, donc plus tard dans la durée de vie de ton programme, quand le callback est invoqué, tu trouves "n'importe quoi" à l'adresse où se trouvait précédemment ton tableau.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    Ok, donc si j'ai bien compris, j'ai une erreur dans la manière d'écrire l'architecture de mon projet. En fait, je vais essayer d'expliquer ce que je souhaite faire.

    Dans ma fenêtre principale, j'ai en gros une partie à droite et une partie à gauche. La partie de gauche est un menu composé de boutons qui ont pour effet de changer la partie de droite. De plus, quand la partie de droite est chargée, j'ai pour chaque page des boutons qui agissent sur le comportement de cette même partie de page.

    L'architecture de mon code est donc :

    * une fonction principale (qui crée la fenêtre principale et le menu).
    - elle continent les fonctions g_signal_connect de chaque bouton qui permettent d'appeler la fonction chargement_page_droite)
    * la fonction chargement_page_droite va, en fonction du bouton, choisir comment remplir la partie droite (appel de différentes fonctions de remplissage).
    * chaque fonction de remplissage possède ses fonctions g_signal_connect qui appellent des fonctions pour effectuer des actions (et c'est là que j'ai le problème précédemment évoqué).

    Je n'ai pas encore codé la fonction chargement_page_droite mais si je comprends bien, je vais avoir le même problème que ce dont je parlais plus haut car je vais vouloir accéder au conteneur de la partie de droite dans des fonctions "externes" à la fonction principale. Quelle est donc la façon d'organiser mon programme pour faire cela ?

  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
    L'architecture en elle même n'est pas nécessairement en cause, j'ai pas trop lu tes explications car je suis pas en état ce soir :-/ Tu dois pouvoir t'en tirer en faisant des allocations dynamiques par exemple au lieu de passedr des adresses de variables locales. Enfin vérifie que c'es tbien ça ton pb déjà

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    Merci Teuf13 pour tes réponses. Par contre, est-ce que tu pourrais me dire ce que tu entends par faire des allocations dynamiques (pour quel élément, dans quelle fonction... ) ?

  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 te conseillerai de reconsulter ton livre de C au sujet de tout ce qui est duree de vie des variables locales, globales, statiques, ...

Discussions similaires

  1. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  2. Réponses: 1
    Dernier message: 08/05/2008, 13h13
  3. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  4. Réponses: 13
    Dernier message: 20/03/2003, 08h11
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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