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 :

enregistrer dans un fichier


Sujet :

GTK+ avec C & C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut enregistrer dans un fichier
    bonjour,

    j'ai un petit problème avec une fonction qui consiste à enregistrer. Pour l'instant je ne cherche qu'à enregistrer un titre que rentre l'utilisateur (entry) et un texte toujours saisi par l'utilisateur (buffer). Mon programme exécute et compile par contre il m'enregistre n'importe quoi, les caractères qu'il m'affiche sont des carrés des virgules mais pas des lettres.
    De plus, je dois l'enregistrer sous un fichier.ics mais je ne sais pas ce que sais? est ce que ca marche pareil qu'un .txt et sous quoi l'enregistrer un bloc note?
    je vous mets ma 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
    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
     
    void on_button5_clicked(GtkButton *button,GtkWidget *view)
    {
    /*déclaration des variables utiles pour récupérer la note*/
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkWidget *entry;
    GtkWidget* pconfirmation;
    gchar* buffer;
     
    /*déclaration d'un pointeur de fichier mémo*/
    FILE *memo;  
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    //On recupere le buffer et on le met dans une variable
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on copie le contenu du buffer dans une variable*/
    buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE);
     
     
     
     
    /*ouverture du fichier memo en écriture */
       memo= fopen("calend.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entry);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fclose(memo);
     
    //affichage d'une fenetre de confirmation d'enregistrement
    pconfirmation = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO ,GTK_BUTTONS_OK, "Votre memo a bien ete enregistre");
    gtk_dialog_run(GTK_DIALOG(pconfirmation));
    gtk_widget_destroy(pconfirmation);
    }
    et voici l'appelle de ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
     g_signal_connect ((gpointer) button5, "clicked",
                        G_CALLBACK (on_button5_clicked),
                        NULL);
    je pense que c'est dans l'appelle qui peut y avoir un problème, surement dans les paramètres ou peut etre un problème d'initialisation enfin je ne vois pas trop, merci

  2. #2
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 287
    Par défaut
    salut,

    ton problème se situe dans le prototype de ta fonction callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void on_button5_clicked(GtkButton *button,GtkWidget *view)
    lorsque tu connectes des signaux à tes widgets, les prototypes à donner à tes fonctions de callback sont rigoureusement spécifiés, ce n'est pas pour rien !

    Ici tu ne peux pas utiliser ce prototype, ce serait plutot quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void on button5_clicked(GtkWidget *widget, gpointer data)
    Maintenant ton souci sera de faire passer les éléments dont tu as besoin dans ta fonction.
    Je te conseille l'utilisation de structures

    EDIT:
    je ne comprends pas ce que tu fais avec cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    entry=lookup_widget(GTK_WIDGET(button),"entry1");

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    void on button5_clicked(GtkWidget *widget, gpointer data)
    je suis d'accord pour ca mais faut bien mettre en parametre ce qu'on va utiliser dans la fonction mettre les variables qu'on utilise dans le programme principale et la fonction. Mon "view" il faut bien que je le récupère de la fonction principale. Dans une de mes fonctions ou je récupère également le buffer c'est comme ca que l'appelle est fait et ca marche.
    Mais là je n'ai surement pas mis assez de parametres enfin je ne vois pas trop.
    En tout cas si je mets que gpointer data, c'est sur ca ne marche pas il ne connait pas le view.
    comme vous le dites, je mets en parametres les elements que j'ai besoin dans ma fonction je ne vois pas pourquoi ce que j'ai mis est faux? Que faut-il mettre sinon?

    je ne comprends pas ce que tu fais avec cette ligne ?

    Code :

    /*On récupére ce que l'utilisateur a rentré*/
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    en fait dans ma fenetre il ya un gtkentry et l'utilisateur rentre un titre, je veux récupérer le titre qu'il rentre et je le fais par cette ligne de code. J'utilise cette même ligne dans une autre fonction et ca marche , je ne vois pas trop ce qui vous gene? C'est mon prof qui nous dit d'utiliser des lookup_widget.

    merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    puis je avoir un peu d'aide s'il vous plait, je veux juste comprendre pourquoi ma fonction ne marche pas et comment faire, en effet j'ai loin d'avoir terminer avec cette fonction (et je pense avoir encore besoin d'aide un peu plus tard) j'ai encore plein de trucs à rajouter mais tant que ca ne marche pas je ne penses pas que ca sert a quelque chose de continuer car je ne pourrais pas le tester. Je penses que ca doit etre tout bete je ne penses pas qu'il y ait une erreur dans la fonction proprement dit mais je ne vois pas.
    merci

  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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Tu auras quelques modifications c'est sûr.


    1.- :
    Il faut toujours respecter les prototype des callback pour les signaux, si ton prof te dit de changer, tu le fait venir ici et on va lui donner des cours sur GTK+

    Ta fonction doit donc être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void on_button5_clicked (GtkButton *button, gpointer data)
    Donc en résumé, si tu dois récupérer les contenu de plusieurs widgets bin tu les met dans une structure ou éventuellement un GList que tu passes ensuite en dernier argument de g_signal_connect ce qui les mettra dans l'argument data !

    2.- :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    Surement spécifique à Glade donc pas bien, le mieux reste encore d'utiliser les fonctions de GTK+, les vraies donc si c'est un GtkEntry: gtk_entry_get_text

    Le reste de ta fonction est à adapter suivant le type de regroupement de widgets que tu vas opter (liste ou structure) !

    3.- :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     g_signal_connect ((gpointer) button5, "clicked",
                        G_CALLBACK (on_button5_clicked),
                        NULL);
    Comme je le répète sans cesse, ceci n'est pas un appel, cela permet de lier une fonction callback à un événement d'un spécifique d'un widget ! De plus l'appel de g_signal_connect n'est pas correct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     g_signal_connect (G_OBJECT(button5), "clicked",
                        G_CALLBACK (on_button5_clicked),
                        NULL);
    C'est ainsi qu'il faut faire et pas autrement.
    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
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    plusieurs choses que je ne comprend pas
    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 on_button4_clicked(GtkButton *button,GtkWidget *view)
    {
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkWidget *entry;
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    /*On affiche la chaîne vide*/
    gtk_entry_set_text(GTK_ENTRY(entry)," ");
     
    //On recupere le buffer
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on supprime le contenu du buffer*/
    gtk_text_buffer_delete(text_buffer,&start,&end);
    voici ma fonction et celle la marche, je suis d'accord qu'il faudrait mettre void on_button4_clicked(GtkButton *button,gpointer user_data)
    mon problème c'est qu'après ca ne marche pas et c'est la solution que j'ai trouvé la plus simple car c'est un peu du chinois quand tu me parles de structures ou de le faire passer en glist, comment le changer?


    ensuite pour entry=lookup_widget(GTK_WIDGET(button),"entry1");
    mon prof nous demande de l'utiliser, en effet c'est spécifique à glade, mon problème c'est qu'il marche dans cette fonction mais dans ma fonction enregistrer il ne doit pas marcher car pour celui la il me marque n'importe quoi, je ne vois pas pourquoi?

    voici ma fonction enregistrer
    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
     
    void on_button5_clicked(GtkButton *button,GtkWidget *view, GtkWidget *entry)
     
    {
    /*déclaration des variables utiles pour récupérer la note*/
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkWidget *entrer;
    GtkWidget* pconfirmation;
    gchar* buffer;
     
    /*déclaration d'un pointeur de fichier mémo*/
    FILE *memo;  
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    //entry=lookup_widget(GTK_WIDGET(button),"entry1");
    entrer=gtk_entry_get_text(entry);
    //On recupere le buffer et on le met dans une variable
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on copie le contenu du buffer dans une variable*/
    buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE);
     
     
     
     
    /*ouverture du fichier memo en écriture */
       memo= fopen("calend.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entry);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fclose(memo);
     
    //affichage d'une fenetre de confirmation d'enregistrement
    pconfirmation = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO ,GTK_BUTTONS_OK, "Votre memo a bien ete enregistre");
    gtk_dialog_run(GTK_DIALOG(pconfirmation));
    gtk_widget_destroy(pconfirmation);
    }
    je sais que le void ne va pas mais on revient au problème d'au dessus, sinon problème avec mon lookup, j'ai du coup essayé ce que tu m'as dit mais il me met type incompatible surement parce que mon void ne va pas je suppose?

    merci

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    j'ai fait un truc je voudrais savoir si c'est bon , car ca marche mais savoir si la syntaxe est correcte:
    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
     
    void on_button4_clicked(GtkButton *button,gpointer user_data)
     
    //void on_button4_clicked(GtkButton *button,GtkWidget *view)
    {
    GtkWidget* textview=user_data;
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkWidget *entry;
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
     
    entry=lookup_widget(GTK_WIDGET(button),"entry1");
    /*On affiche la chaîne vide*/
    gtk_entry_set_text(GTK_ENTRY(entry)," ");
     
     
    //On recupere le buffer
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on supprime le contenu du buffer*/
    gtk_text_buffer_delete(text_buffer,&start,&end); 
     
    }
    voila j'ai bien mis la synytaxe pour le void et en dessous je l'ai mis egale à user data.
    Maintenant que ca marche et en espérant que ce soit bon, j'ai essayer pour ma fonction enregistrer mais là j'ai besoin de plusieurs champs egale à user_data ai-je le droit de mettre ca comme ca:
    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
     
    void on_button5_clicked(GtkButton *button,gpointer user_data)
     
    {
    /*déclaration des variables utiles pour récupérer la note*/
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    GtkEntry *entrer;
    GtkWidget *textview=user_data;
    GtkWidget *entry=user_data;
    GtkWidget* pconfirmation;
    gchar* buffer;
     
    /*déclaration d'un pointeur de fichier mémo*/
    FILE *memo;  
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    //entry=lookup_widget(GTK_WIDGET(button),"entry1");
    entrer=gtk_entry_get_text(GTK_ENTRY(entry));
    //On recupere le buffer et on le met dans une variable
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on copie le contenu du buffer dans une variable*/
    buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE);
     
     
     
     
    /*ouverture du fichier memo en écriture */
       memo= fopen("calend.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entrer);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fclose(memo);
     
    //affichage d'une fenetre de confirmation d'enregistrement
    pconfirmation = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO ,GTK_BUTTONS_OK, "Votre memo a bien ete enregistre");
    gtk_dialog_run(GTK_DIALOG(pconfirmation));
    gtk_widget_destroy(pconfirmation);
    }
    j'en ai deux egale à user_data, est ce genant sachant que j'ai associé mon boutton de cette manière?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(button4),"clicked",G_CALLBACK(on_button4_clicked),textview1,entry1);
    L'autre problème c'est cette parti là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //entry=lookup_widget(GTK_WIDGET(button),"entry1");
    entrer=gtk_entry_get_text(GTK_ENTRY(entry));
    les deux ne marche pas, que j'utilise l'une ou l'autre ca ne lui va pas et je ne sais pas pourquoi?
    la première avec le lookup compile exécute mais elle enregistrer n'importe quelle lettre dans le fichier
    la deuxième il me met argument non compatible est ce mon entry ou/et mon entrer qui sont mal déclarer
    enfin dans les deux cas je ne vois pas
    merci

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    j'ai régler le problème que j'avais avec l'enregistrement du entry mais le premier problème reste le meme c'est comment mettre le textview et entry en parametre car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),textview1,entry1);
    ca en fait ca ne marche pas
    j'ai donc essayé de définir une structure du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     typedef struct
    {
      GtkWidget *textview1;
       GtkWidget *entry1;
    }
    text_st;
    je l'ai déclarer comme ceci
    text_st st;
    j'ai mis ca dans interface.c du coup j'ai déclarer mon entry et mon textview avec st.textview1
    et j'ai connecté mon bouton de cette facon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),(gpointer) &st);
    le problème c'est dans callback.c
    j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    text_st    * p_st   = user_data;
    et là il me met text_st non déclaré
    j'ai pas dut tout bien comprendre avec les structures
    comment ca marche? Puis je utiliser ca comme ca?
    en fait comment faire?
    je veins bien savoir aussi si le code que j'ai mis au bouton4 dans mon message posté à 21h14 aujourd'hui est correcte ou pas
    merci

  9. #9
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par pepsister
    je l'ai déclarer comme ceci
    text_st st;
    j'ai mis ca dans interface.c du coup j'ai déclarer mon entry et mon textview avec st.textview1
    et j'ai connecté mon bouton de cette facon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),(gpointer) &st);
    le problème c'est dans callback.c
    j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    text_st    * p_st   = user_data;
    et là il me met text_st non déclaré
    Bin je crois que le message est assez explicite non ? Ta la définition de ta structure n'est pas accessible par ton le module callback.c, met donc cette structure dans par exemple callback.h, tout ira mieux ! Le fait de ne pas maîtrisee un minimum le Langage C et la programmation modulaire, c'est pas bien pour passer à GTK+ et encore moins à Glade si on ne maîtrise pas GTK+ ... malgrés que ce soit pour les cours mais il serait bon d'approfondir tes connaissances. On ne programme pas au hasard en C et il existe de nombreux cours complets en ligne pour se perfectionner !
    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 !

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    je suis d'accord qu'il faut que j'approfondisse mais mon projet est a rendre très bientot et il est coef 30 doncj'ai pas trop le choix.
    j'ai un rpoblème à l'exécution il compile et ne me dit rien mais maintenat la fonction enregistrer ne marche plus du tout
    voici mon interface.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     text_st    st;
     st.entry1 = gtk_entry_new ();
      gtk_widget_show (st.entry1);
      gtk_box_pack_start (GTK_BOX (vbox1), st.entry1, FALSE, FALSE, 1);
     st.textview1 = gtk_text_view_new ();
      gtk_widget_show (st.textview1);
      gtk_container_add (GTK_CONTAINER (scrolledwindow1), st.textview1);
      gtk_container_set_border_width (GTK_CONTAINER (st.textview1), 5);
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),(gpointer) &st);
    GLADE_HOOKUP_OBJECT (window1, st.entry1, "entry1");
    GLADE_HOOKUP_OBJECT (window1, st.textview1, "textview1");
    je ne mets que ce qui fait référence a la structure
    voici maintenant mon callback.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct
    {
      GtkWidget *textview1;
       GtkWidget *entry1;
    }
    text_st;
    void
    on_button5_clicked (GtkButton       *button,gpointer         user_data);
    et voici mon callback.h
    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
     
    void on_button5_clicked(GtkButton *button,gpointer user_data)
     
    {
    /*déclaration des variables utiles pour récupérer la note*/
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    const gchar *entrer;
    GtkWidget* pconfirmation;
    gchar* buffer;
    text_st    * p_st   = user_data;
     
    /*déclaration d'un pointeur de fichier mémo*/
    FILE *memo;  
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    //entry=lookup_widget(GTK_WIDGET(button),"entry1");
    entrer=gtk_entry_get_text(GTK_ENTRY(p_st->entry1));
    //On recupere le buffer et on le met dans une variable
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(p_st->textview1));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on copie le contenu du buffer dans une variable*/
    buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE);
     
     
     
     
    /*ouverture du fichier memo en écriture */
       memo= fopen("calend.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entrer);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fclose(memo);
     
    //affichage d'une fenetre de confirmation d'enregistrement
    pconfirmation = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO ,GTK_BUTTONS_OK, "Votre memo a bien ete enregistre");
    gtk_dialog_run(GTK_DIALOG(pconfirmation));
    gtk_widget_destroy(pconfirmation);
    }
    et là je ne vois pas ce qui ne va pas, il ne me met aucun message d'erreur, dès que j'appuie sur enregistrer, il ferme la fenêtre
    comment dois je faire?
    merci encore

  11. #11
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Attention, dans ton interface.c ta déclaration suivante:
    déclare bel et bien une variable du type de ta structure mais cela reste une variable locale, une fois la fonction terminée la variable n'existe plus alors soit tu déclare cette variable à l'intérieur même du main et tu modifies la fonction pour pouvoir passer l'adresse de cette variable (le reste se fait alors par le biais de pointeur).

    Seconde solution, tu déclares un pointeur dans la fonction actuelle mais il faut alors que tu alloues son adresse mémoire pour pouvoir l'utiliser mais il faut garder une trace du pointeur pour pouvoir le libérer ultérieurement !
    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 !

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    Attention, dans ton interface.c ta déclaration suivante:

    Code :
    text_st st;
    déclare bel et bien une variable du type de ta structure mais cela reste une variable locale, une fois la fonction terminée la variable n'existe plus alors soit tu déclare cette variable à l'intérieur même du main et tu modifies la fonction pour pouvoir passer l'adresse de cette variable (le reste se fait alors par le biais de pointeur).
    je ne comprend pas bien, si c'est une variable locale, faut il que je déclare du coup,
    GtkWidget *entry1;
    GtkWidget *textview1;
    dans mon interface.c?
    je pensais que ce n'était pas la peine si on mettait text_st st;
    en fait je passe text_st st; dans le main , dans interface.c je déclare normalement mon entry et textview? je ne vois pas quand tu dis qu'il faut modifier la fonction pour pouvoir passer l'adresse de cette variable

  13. #13
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    En fait tu ne change presque rien, dans ta fonction qui se situe dans le fichier interface.c (pourrais-je voir sa signature ?), tu enlèves juste la déclaration de cette variable (et tu la met plutôt dans le main) et partout où tu fait référence aux widgets de cette structure comme par exemple:
    tu modifies en fait l'opérateur de déréférencement soit:
    car en fait la structure que tu auras en argument à ta fonction sera en fait un pointeur qui pointe sur l'adresse de ta structure !
    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 !

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    en faisant ce que tu me dit et en enlevant la déclaration dans interface.c du coup il me met "st" non déclaré, ce qui me parrait logique.
    C'est quoi la signature ?

  15. #15
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bin le prototype de la fonction !
    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 !

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    je te remets tout avec ce que tu m'as dit de mettre:
    interface.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    st->entry1 = gtk_entry_new ();
      gtk_widget_show (st->entry1);
      gtk_box_pack_start (GTK_BOX (vbox1), st->entry1, FALSE, FALSE, 1);
    st->textview1 = gtk_text_view_new ();
      gtk_widget_show (st->textview1);
      gtk_container_add (GTK_CONTAINER (scrolledwindow1), st->textview1);
      gtk_container_set_border_width (GTK_CONTAINER (st->textview1), 5);
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),(gpointer) &st);
    callback.c
    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
     
    void on_button5_clicked(GtkButton *button,gpointer user_data)
     
    {
    /*déclaration des variables utiles pour récupérer la note*/
    GtkTextBuffer* text_buffer=0;
    GtkTextIter start;
    GtkTextIter end;
    const gchar *entrer;
    GtkWidget* pconfirmation;
    gchar* buffer;
    text_st    * p_st   = user_data;
     
     
    /*déclaration d'un pointeur de fichier mémo*/
    FILE *memo;  
     
     
    /*On récupére ce que l'utilisateur a rentré*/                                        
    entrer=gtk_entry_get_text(GTK_ENTRY(p_st->entry1));
    //On recupere le buffer et on le met dans une variable
    text_buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(p_st->textview1));
    //On recupere l'origine du buffer
    gtk_text_buffer_get_start_iter(text_buffer,&start);
    //On recupere la fin du buffer
    gtk_text_buffer_get_end_iter(text_buffer,&end);
    /*on copie le contenu du buffer dans une variable*/
    buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE);
     
    /*ouverture du fichier memo en écriture */
       memo= fopen("calend.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entrer);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fclose(memo);
     
    //affichage d'une fenetre de confirmation d'enregistrement
    pconfirmation = gtk_message_dialog_new (NULL,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO ,GTK_BUTTONS_OK, "Votre memo a bien ete enregistre");
    gtk_dialog_run(GTK_DIALOG(pconfirmation));
    gtk_widget_destroy(pconfirmation);
    }
    et voici mon main
    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
     
    int
    main (int argc, char *argv[])
    {
      GtkWidget *window1;
       text_st    st;
     
    #ifdef G_OS_WIN32
      gchar *temp;
     
      package_prefix = g_win32_get_package_installation_directory (NULL, NULL);
      package_datadir = g_strdup_printf ("%s%s", package_prefix, "/share");
    #endif
     
    #ifdef ENABLE_NLS
    #ifdef G_OS_WIN32
      temp = g_strdup_printf ("%s%s", package_prefix, "/lib/locale");
      bindtextdomain (GETTEXT_PACKAGE, temp);
      g_free (temp);
    #else
      bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
    #endif
      bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
      textdomain (GETTEXT_PACKAGE);
    #endif
     
      gtk_set_locale ();
      gtk_init (&argc, &argv);
     
    #ifdef G_OS_WIN32
      temp = g_strdup_printf ("%s/%s%s", package_datadir, PACKAGE, "/pixmaps");
      add_pixmap_directory (temp);
      g_free (temp);
    #else
      add_pixmap_directory (PACKAGE_DATA_DIR "/" PACKAGE "/pixmaps");
    #endif
     
     
      /*
       * The following code was added by Glade to create one of each component
       * (except popup menus), just so that you see something after building
       * the project. Delete any components that you don't want shown initially.
       */
      window1 = create_window1 ();
      gtk_widget_show (window1);
     
      gtk_main ();
     
    #ifdef G_OS_WIN32
      g_free (package_prefix);
      g_free (package_datadir);
    #endif
      return 0;
    }
    merci,

  17. #17
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bon, juste deux choses... Dans l'appel de g_signal_connect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(button5),"clicked",G_CALLBACK(on_button5_clicked),(gpointer) &st)
    Enlève juste ce que j'ai mis en rouge

    Dans ton main, tu as l'appel suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window1 = create_window1 ();
    C'est précisément la signature de cette fonction que je t'avais demandé, son prototype quoi, donc vu l'appel, je présume que sa signature est ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkWidget * create_window1 (void);
    Il faut donc changer et lui permettre de recevoir un argument, ta strcuture ou plus présicément un pointeur ou adresse donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkWidget * create_window1 (text_st * st);
    Change donc avec cette signature dans le fichier interface.h et interface.c.

    L'appel se fera donc dans le main de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    window1 = create_window1 (& st);

    Tu vois, c'est tout simple, c'était juste ca, passer l'adresse de ta structure déclarée dans le main à la fonction qui construit la fenêtre, rien de plus
    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 !

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    quand je fais ca il me met des messages d'erreurs que je ne comprend même pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    12 C:\Documents and Settings\pepita\Projets\glade\projet2\src\main.c In file included from src/main.c 
    5 C:\Documents and Settings\pepita\Projets\glade\projet2\src\interface.h syntax error before '*' token 
    26 C:\Documents and Settings\pepita\Projets\glade\projet2\src\main.c `text_st' undeclared (first use in this function) 
    26 C:\Documents and Settings\pepita\Projets\glade\projet2\src\main.c syntax error before "st" 
    65 C:\Documents and Settings\pepita\Projets\glade\projet2\src\main.c `st' undeclared (first use in this function)
    les erreurs font toutes référence au main.c

    je te remets mon main.c
    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
     
    #include "interface.h"
    #include "support.h"
     
    #ifdef G_OS_WIN32
    char *package_prefix;
    char *package_datadir;
    #endif
     
     
     
    int
    main (int argc, char *argv[])
    {
      GtkWidget *window1;
      text_st    st;
     
     
    #ifdef G_OS_WIN32
      gchar *temp;
     
      package_prefix = g_win32_get_package_installation_directory (NULL, NULL);
      package_datadir = g_strdup_printf ("%s%s", package_prefix, "/share");
    #endif
     
    #ifdef ENABLE_NLS
    #ifdef G_OS_WIN32
      temp = g_strdup_printf ("%s%s", package_prefix, "/lib/locale");
      bindtextdomain (GETTEXT_PACKAGE, temp);
      g_free (temp);
    #else
      bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
    #endif
      bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
      textdomain (GETTEXT_PACKAGE);
    #endif
     
      gtk_set_locale ();
      gtk_init (&argc, &argv);
     
    #ifdef G_OS_WIN32
      temp = g_strdup_printf ("%s/%s%s", package_datadir, PACKAGE, "/pixmaps");
      add_pixmap_directory (temp);
      g_free (temp);
    #else
      add_pixmap_directory (PACKAGE_DATA_DIR "/" PACKAGE "/pixmaps");
    #endif
     
     
      /*
       * The following code was added by Glade to create one of each component
       * (except popup menus), just so that you see something after building
       * the project. Delete any components that you don't want shown initially.
       */
      window1 = create_window1 (&st);
      gtk_widget_show (window1);
     
      gtk_main ();
     
    #ifdef G_OS_WIN32
      g_free (package_prefix);
      g_free (package_datadir);
    #endif
      return 0;
    }
    j'ai dans mon callback.h ma structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct
    {
      GtkWidget *textview1;
       GtkWidget *entry1;
    }
    text_st;
    et voici mon interface.h où,il met un msg d'erreur mais jene penses pas que ca vienne de la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /*
     * DO NOT EDIT THIS FILE - it is generated by Glade.
     */
     
    GtkWidget* create_window1 (text_st * st);
    merci

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    je suppose qu'il faudrait plutot mettre ma structure dans le main.c plutot que dans le callback.h ca réglerait surement les problemes de déclaration du st , mais pas le reste?

  20. #20
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Oui normal, il ne connait pas ta structure dans certains modules car elle est définie dans callback.h mais celui-ci n'est pas inclus dans main.c par exemple donc ce que tu peux faire, c'est déménager ta structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
      GtkWidget *textview1;
       GtkWidget *entry1;
    }
    text_st;
    dans le fichier interface.h, ce qui reste encore le plus logique et inclure interface.h également dans callback.c histoire qu'il reconnaisse également ta structure dans ce module car il en a besoin.

    C'est juste un petit jeu d'inclusion c'est tout
    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 !

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/11/2005, 18h03
  2. comment ne pas enregistrer dans le fichier log?
    Par trotters213 dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 21/03/2005, 14h56
  3. [LG]Enregistrements dans un fichier
    Par ticoude dans le forum Langage
    Réponses: 1
    Dernier message: 26/11/2004, 18h33
  4. [LG]supprimer un enregistrement dans un fichier
    Par Marcus2211 dans le forum Langage
    Réponses: 10
    Dernier message: 17/11/2003, 00h59
  5. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

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