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 gtk_calendar_get_date


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème avec gtk_calendar_get_date
    Bonjour,

    Nouveau sur gtk je bloque sur un problème pour obtenir le retour d'un calendrier.

    J'ai une fenêtre ou lorsque l'on clique sur un bouton l'action est d'ouvrir une nouvelle fenêtre où se trouve un calendrier.
    Lorsque l'utilisateur double clique sur un jour, normalement je devrais avoir le retour mais à la place j'ai un Segmentation Fault...

    Voici les extraits du code :

    /* Structure contenant le calendrier */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct _CalendarData {
      GtkWidget *calendar;
      guint jour,mois,annee;
    } CalendarData;
     
    static CalendarData Calendar_arrive;
    /* Fonction qui devrait me donner le jour, le mois et l'année */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    static void get_date_calendar(GtkWidget *widget, CalendarData *data)
    {
     
      gtk_calendar_get_date (GTK_CALENDAR (data->calendar), &data->jour, &data->mois, &data->annee);
     
    }

    /* Création de la fenêtre où s'affiche le calendrier */
    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
     
    static void calendrier(GtkWidget *widget, CalendarData *data)
    {
     
     /* Creation de la fenetre */
     
        GtkWidget *pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Calendrier");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
     
        /* Creation du calendrier*/
        data->calendar=gtk_calendar_new();
        /* On ajoute le label a l'interieur de la fenetre */
        gtk_container_add(GTK_CONTAINER(pWindow), data->calendar);
        g_signal_connect (data->calendar, "day_selected_double_click", G_CALLBACK (get_date_calendar), &data);
     
        /* Affichage de la fenetre et de tout ce qu'il contient */
        gtk_widget_show_all(pWindow);
     
     
    }


    /* La façon dont j'appelle la fonction par le clique sur un bouton */

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      g_signal_connect(G_OBJECT(pExecuteBtn), "clicked", G_CALLBACK(calendrier), &Calendar_arrive);
    Merci à vous.
    Dernière modification par Invité ; 04/07/2010 à 09h36.

  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
    Salut et bienvenue dans le monde merveilleux de Gtk+ .

    J'ai écrit un petit code exemple pour que tu vois comment ca fonctionne. Il me semble que pour ton code le problème vient de la déclaration de data. Tu dois certainement le déclarer en tant que pointeur et tu ne dois pas allouer de l'espace dans le tas. Il pointe alors n'importe où, d'où le segdefault.

    Voila le code opérationnel :
    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
    #include <gtk/gtk.h>
     
    typedef struct _CalendarData {
      GtkWidget *calendar;
      guint jour,mois,annee;
    } CalendarData;
     
    void get_date_calendar(GtkWidget *widget, CalendarData *data)
    {
     
      gtk_calendar_get_date (GTK_CALENDAR (data->calendar), &data->annee, &data->mois, &data->jour);
     
      g_print("Date sélectionnée : %d/%d/%d\n", data->jour, data->mois, data->annee);
    }
     
    int main(int argc, char **argv)
    {
        CalendarData data;
     
        gtk_init(&argc, &argv);
     
        GtkWidget *pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Calendrier");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        // signaux pour la fermeture de l'application
        g_signal_connect(GTK_OBJECT(pWindow), "delete_event", (GCallback)gtk_exit, NULL);
        g_signal_connect(GTK_OBJECT(pWindow), "destroy", (GCallback)gtk_exit, NULL);
     
        /* Creation du calendrier*/
        data.calendar=gtk_calendar_new();
        /* Insertion du calendrier dans la fenetre */
        gtk_container_add(GTK_CONTAINER(pWindow), data.calendar);
        g_signal_connect (data.calendar, "day_selected_double_click", G_CALLBACK (get_date_calendar), &data);
     
        /* Affichage de la fenetre et de tout ce qu'elle contient */
        gtk_widget_show_all(pWindow);
        gtk_main();
     
        return 0;
    }
    Bonne lecture ...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ah merci j'ai vu mon erreur !

    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    static void calendrier(GtkWidget *widget, CalendarData *data)
    {
    Je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (data->calendar, "day_selected_double_click", G_CALLBACK (get_date_calendar), &data);
    A la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (data->calendar, "day_selected_double_click", G_CALLBACK (get_date_calendar), data);
    Puisque je dois envoyer ce coup-ci le pointeur et non l'adresse du pointeur.

    Tout fonctionne. Merci

  4. #4
    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
    Le '&' avant data dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect (data->calendar, "day_selected_double_click", G_CALLBACK (gtk_calendar_get_date), &data);
    me semble de trop.

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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