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 :

Passage de structure


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    dessinateur projeteur VRD
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : dessinateur projeteur VRD
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut Passage de structure
    Bonjour,

    J'ai un problème au niveau de passage de structure à une fonction
    Je crée une structure dans un fichier .h
    Je vais éviter de mettre toutes mes lignes de code pour une meilleure compréhension.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ...
    // Définition de la structure de la fenêtre principale
    struct ELEMENT
    {
    	GtkWidget *p_Fenetre[1];
    	GtkWidget *p_Vboite[3];
    	GtkWidget *p_Selecteur[6];
    };
    typedef struct ELEMENT ELEMENT;
     
    // Prototype des fonctions
    void fenetre_principale( ELEMENT *p_Element );
    ...
    Je crée ma variable structure Element que je passe à ma fonction fenetre_principale(&Element).
    Jusqu'ici pas de problème, j'arrive à accéder aux variables de ma structure dans cette fonction.

    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
    ...
    int main (int argc, char *argv[])
    {
     
       gtk_init(&argc, &argv);
       ELEMENT Element;
     
       // Création de la fenêtre principale
          fenetre_principale(&Element);
          create_list (&Element);
     
       // Construction du tableau de prêt
       // affichage de l'ensemble
       gtk_widget_show_all(Element.p_Fenetre[0]);
       gtk_main();
    	return (EXIT_SUCCESS);
    }
    ...
    C'est à partir d'une seconde fonction ( calcul_pret ) lancée dans la fonction fenetre_principale(&Element).
    que j'ai une erreur de segmentation
    Je n'arrive pas à récupérer les variables de ma structure Element

    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
    ...
    void fenetre_principale( ELEMENT *Element )
    {
    ...
     
    // Définition des callbacks
         g_signal_connect (
            G_OBJECT (p_Bouton[0]), 
            "clicked",G_CALLBACK(Calcul_pret),(gpointer)Element
            );
     
    ...
    }
     
    void Calcul_pret ( GtkWidget p_Widget, gpointer p_data )
    {
       // Conversion des datas dans une structure ELEMENT
       ELEMENT *Recup = (ELEMENT*) p_data;
       // Variables récupération des données
       gchar Paie_1_emprunteur;
     
       // Récupération des informations
       Paie_1_emprunteur = gtk_spin_button_get_value_as_int 
          (GTK_SPIN_BUTTON (Recup -> p_Selecteur[0]));
    }
    ...

  2. #2
    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
    Pour commencer je n'aime guère cette ligne : typedef struct ELEMENT ELEMENT;Commence par éviter de donner des noms identiques aux structures et aux définitions de type.

    gpointer est un pointeur non typé void*. Il me semble que tu transmets l'adresse du pointeur d'Element et non le pointeur d'Element. Envoie directement Element plutôt que (gpointer)Element.

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    D'accord avec ta première remarque, mais:

    Citation Envoyé par gerald3d Voir le message
    gpointer est un pointeur non typé void*. Il me semble que tu transmets l'adresse du pointeur d'Element et non le pointeur d'Element. Envoie directement Element plutôt que (gpointer)Element.
    Là je ne suis pas d'accord, son code a l'air correct à ce niveau là. C'est la première chose que j'ai regardé. En fait là son cast en gpointer ne sert à rien parce qu'il serait casté implicitement de toute façon, mais c'est la callback qui est importante pour savoir comment le paramètre sera interprété, plus que le type passé dans g_signal_connect (qui ne vérifiera de toute façon aucun type).

  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
    Oui possible. Je n'ai pas regardé si le prototype de la callback était respecté

  5. #5
    Membre averti
    Homme Profil pro
    dessinateur projeteur VRD
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : dessinateur projeteur VRD
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Pour commencer je n'aime guère cette ligne : typedef struct ELEMENT ELEMENT;Commence par éviter de donner des noms identiques aux structures et aux définitions de type.

    gpointer est un pointeur non typé void*. Il me semble que tu transmets l'adresse du pointeur d'Element et non le pointeur d'Element. Envoie directement Element plutôt que (gpointer)Element.
    J'ai résolu le problème avec de la persévérance
    Il y avait effective l'erreur ci-dessus (gpointeur)Element -> Element et une seconde erreur GtkWidget p_Widget -> GtkWidget *p_Widget

    Je ne comprends pas pourquoi GtkWidget p_Widget a une influence sur p_data

  6. #6
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Ah, effectivement, c'est l'étoile qui manque ligne 15. Le cast gpointer n'était pas une erreur, il est juste inutile je pense. Si cela plantait, c'est que tu écrivais dans la pile l'adresse de ton GtkWidget, l'adresse de ta structure élement, mais au moment de les relire, tu lisait une structure GtkWidget, et pas l'adresse de cette structure. Tu lis donc trop d'octets dans la pile pour remplir la structure, et donc ta variable p_data est remplie avec quelque chose qui se trouve beaucoup plus loin dans la pile que là où se trouve réellement l'adresse qui t'intéresse, ce qui fait qu'elle contient n'importe quoi. Dès que tu essaies de l'utiliser, vu que le pointeur est devenu « fou » et pointe n'importe où, tu as une erreur de segmentation.

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

Discussions similaires

  1. Passage de structure dans une DLL
    Par nikoko34 dans le forum VB.NET
    Réponses: 1
    Dernier message: 18/07/2008, 10h11
  2. Passage de structure en paramètre
    Par jojodu31 dans le forum Débuter
    Réponses: 6
    Dernier message: 24/04/2008, 16h41
  3. Passage de structure en paramètre
    Par pegase.90 dans le forum C
    Réponses: 16
    Dernier message: 16/04/2007, 15h56
  4. Passage de structure en parametres
    Par beb30 dans le forum Visual C++
    Réponses: 10
    Dernier message: 28/08/2006, 17h31
  5. [Activex] Passage de Structure
    Par KPitN dans le forum MFC
    Réponses: 2
    Dernier message: 07/03/2005, 14h05

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