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] Une Calculatrice


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 2
    Par défaut [Problème] Une Calculatrice
    Bonjour,

    Je commence à utiliser la bibliothèque GTK+ depuis un moment. J'en viens donc à programmer une calculatrice basique, mais je rencontre un problème gérer les évènements des boutons :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <gtk/gtk.h>
    #include <math.h>
     
        GtkWidget* maFenetre = NULL;;
        GtkWidget* monBouton[16];
        GtkWidget* maTable = NULL;;
        GtkWidget* monTexte = NULL;;
     
    void numero_un(GtkWidget* monBouton[0], gpointer data);
     
    int main(int argc,char **argv) {
        int i = 0;
     
        gtk_init(&argc,&argv);
     
        maFenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(maFenetre), "Calculatrice");
        gtk_window_set_default_size(GTK_WINDOW(maFenetre), 200, 200);
     
        // Création de la table
        maTable = gtk_table_new(5,4,TRUE);
        gtk_container_add(GTK_CONTAINER(maFenetre), GTK_WIDGET(maTable));
     
        // Creation du label
        monTexte = gtk_entry_new();
        gtk_entry_set_text(GTK_ENTRY(monTexte), "Composez le calcul");
     
        // Création des boutons :
        monBouton[0] = gtk_button_new_with_label("1");
        g_signal_connect(G_OBJECT(monBouton[0]), "clicked", G_CALLBACK(numero_un), NULL);
     
        monBouton[1] = gtk_button_new_with_label("2");
        monBouton[2] = gtk_button_new_with_label("3");
        monBouton[3] = gtk_button_new_with_label("+");
     
        monBouton[4] = gtk_button_new_with_label("4");
        monBouton[5] = gtk_button_new_with_label("5");
        monBouton[6] = gtk_button_new_with_label("6");
        monBouton[7] = gtk_button_new_with_label("-");
     
        monBouton[8] = gtk_button_new_with_label("7");
        monBouton[9] = gtk_button_new_with_label("8");
        monBouton[10] = gtk_button_new_with_label("9");
        monBouton[11] = gtk_button_new_with_label("/");
     
        monBouton[12] = gtk_button_new_with_label(".");
        monBouton[13] = gtk_button_new_with_label("0");
        monBouton[14] = gtk_button_new_with_label("=");
        monBouton[15] = gtk_button_new_with_label("*");
     
        for (i = 0 ; i < 16 ; i++)
        {
            gtk_widget_set_size_request (GTK_WIDGET(monBouton[i]), 40, 30);
        }
        // Insertion des boutons et du label :
        gtk_table_attach(GTK_TABLE(maTable), monTexte, 0, 4, 0, 1, GTK_EXPAND, GTK_EXPAND, 0,0);
     
        gtk_table_attach(GTK_TABLE(maTable), monBouton[0], 0, 1, 1, 2, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[1], 1, 2, 1, 2, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[2], 2, 3, 1, 2, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[3], 3, 4, 1, 2, GTK_EXPAND, GTK_EXPAND, 0,0);
     
        gtk_table_attach(GTK_TABLE(maTable), monBouton[4], 0, 1, 2, 3, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[5], 1, 2, 2, 3, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[6], 2, 3, 2, 3, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[7], 3, 4, 2, 3, GTK_EXPAND, GTK_EXPAND, 0,0);
     
        gtk_table_attach(GTK_TABLE(maTable), monBouton[8], 0, 1, 3, 4, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[9], 1, 2, 3, 4, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[10], 2, 3, 3, 4, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[11], 3, 4, 3, 4, GTK_EXPAND, GTK_EXPAND, 0,0);
     
        gtk_table_attach(GTK_TABLE(maTable), monBouton[12], 0, 1, 4, 5, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[13], 1, 2, 4, 5, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[14], 2, 3, 4, 5, GTK_EXPAND, GTK_EXPAND, 0,0);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[15], 3, 4, 4, 5, GTK_EXPAND, GTK_EXPAND, 0,0);
     
        g_signal_connect(G_OBJECT(monBouton[0]), "clicked", G_CALLBACK(numero_un), NULL);
     
        // Affichage de la fenetre et de tout ce qu'elle contient
        gtk_widget_show_all(maFenetre);
        g_signal_connect(G_OBJECT(maFenetre), "destroy", G_CALLBACK(gtk_main_quit), NULL);
        gtk_main();
     
        return EXIT_SUCCESS;
    }
     
    void numero_un(GtkWidget* monBouton[0], gpointer data) {
     
        gchar stext[100];
        sprintf(stext, "%s", gtk_entry_get_text(GTK_ENTRY(monTexte)));
        strcat(stext, gtk_button_get_label(GTK_BUTTON(monBouton[0])));
        gtk_entry_set_text(GTK_ENTRY(monTexte), stext);
     
    }
    En effet, dès le moment où je clique sur le bouton 1, Windows m'indique que le programme a rencontré un problème et qu'il doit fermer. Mais, je ne trouve mon erreur, donc si vous avez une idée, n'hésitez pas !

    Cordialement,

    Edit :Le problème est resolu, merci quand même

  2. #2
    Invité
    Invité(e)
    Par défaut
    Merci de faire un suivi, Comment as-tu résolu le problème ?

  3. #3
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    A priori, dans son callback, il déclarait un tableau de 0 pointeurs sur GtkWidget
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void numero_un(GtkWidget* monBouton[0], gpointer data) {
     
        gchar stext[100];
        sprintf(stext, "%s", gtk_entry_get_text(GTK_ENTRY(monTexte)));
        strcat(stext, gtk_button_get_label(GTK_BUTTON(monBouton[0])));
        gtk_entry_set_text(GTK_ENTRY(monTexte), stext);
     
    }
    Du coup, il accédait à une zone de mémoire non allouée, d'où le segmentation fault

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 2
    Par défaut
    Non en fait, j'ai recrée une nouvelle 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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <gtk/gtk.h>
    #include <math.h>
     
    void afficher(GtkWidget* monBouton, gpointer entry);
     
    int main(int argc,char **argv) {
     
        GtkWidget* maFenetre = NULL;
        GtkWidget* monBouton[16];
        GtkWidget* maTable = NULL;
        GtkWidget* monTexte = NULL;
        int i = 0;
     
        gtk_init(&argc,&argv);
     
        maFenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(maFenetre), "Calculatrice");
        gtk_window_set_default_size(GTK_WINDOW(maFenetre), 200, 200);
     
        // Création de la table
        maTable = gtk_table_new(5,4,TRUE);
        gtk_container_add(GTK_CONTAINER(maFenetre), GTK_WIDGET(maTable));
     
        // Creation du label
        monTexte = gtk_entry_new();
        gtk_entry_set_editable(GTK_ENTRY(monTexte), NULL);
     
        // Création des boutons :
        monBouton[0] = gtk_button_new_with_label("1");
        monBouton[1] = gtk_button_new_with_label("2");
        monBouton[2] = gtk_button_new_with_label("3");
        monBouton[3] = gtk_button_new_with_label(" + ");
     
        monBouton[4] = gtk_button_new_with_label("4");
        monBouton[5] = gtk_button_new_with_label("5");
        monBouton[6] = gtk_button_new_with_label("6");
        monBouton[7] = gtk_button_new_with_label(" - ");
     
        monBouton[8] = gtk_button_new_with_label("7");
        monBouton[9] = gtk_button_new_with_label("8");
        monBouton[10] = gtk_button_new_with_label("9");
        monBouton[11] = gtk_button_new_with_label(" / ");
     
        monBouton[12] = gtk_button_new_with_label(".");
        monBouton[13] = gtk_button_new_with_label("0");
        monBouton[14] = gtk_button_new_with_label(" = ");
        monBouton[15] = gtk_button_new_with_label(" * ");
     
        for (i = 0 ; i < 16 ; i++)
        {
            gtk_widget_set_size_request (GTK_WIDGET(monBouton[i]), 40, 30);
        }
        // Insertion des boutons et du label :
        gtk_table_attach(GTK_TABLE(maTable), monTexte, 0, 4, 0, 1, GTK_EXPAND, GTK_EXPAND, 0,0);
     
        gtk_table_attach(GTK_TABLE(maTable), monBouton[0], 0, 1, 1, 2, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[0]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[1], 1, 2, 1, 2, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[1]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[2], 2, 3, 1, 2, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[2]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[3], 3, 4, 1, 2, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[3]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
     
        gtk_table_attach(GTK_TABLE(maTable), monBouton[4], 0, 1, 2, 3, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[4]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[5], 1, 2, 2, 3, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[5]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[6], 2, 3, 2, 3, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[6]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[7], 3, 4, 2, 3, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[7]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
     
        gtk_table_attach(GTK_TABLE(maTable), monBouton[8], 0, 1, 3, 4, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[8]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[9], 1, 2, 3, 4, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[9]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[10], 2, 3, 3, 4, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[10]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[11], 3, 4, 3, 4, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[11]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
     
        gtk_table_attach(GTK_TABLE(maTable), monBouton[12], 0, 1, 4, 5, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[12]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[13], 1, 2, 4, 5, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[13]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[14], 2, 3, 4, 5, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[14]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
        gtk_table_attach(GTK_TABLE(maTable), monBouton[15], 3, 4, 4, 5, GTK_EXPAND, GTK_EXPAND, 0,0);
        g_signal_connect(G_OBJECT(monBouton[15]), "clicked", G_CALLBACK(afficher),(GtkWidget*)monTexte);
     
        // Affichage de la fenetre et de tout ce qu'elle contient
        gtk_widget_show_all(maFenetre);
        g_signal_connect(G_OBJECT(maFenetre), "destroy", G_CALLBACK(gtk_main_quit), NULL);
        gtk_main();
     
        return EXIT_SUCCESS;
    }
     
    void afficher(GtkWidget* monBouton, gpointer entry) {
     
        gchar stext[100];
        sprintf(stext, "%s", gtk_entry_get_text(GTK_ENTRY(entry)));
        strcat(stext, gtk_button_get_label(GTK_BUTTON(monBouton)));
        gtk_entry_set_text(GTK_ENTRY(entry), stext);
    }
    Mais j'ai un autre problème ( ). Je ne trouve aucun moyen pour afficher le résultat, vous n'auriez pas une solution (la bonne démarche à suivre, rien de plus).

    Merci d'avance.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/12/2008, 18h51
  2. problème pour une calculatrice
    Par Anthobask dans le forum C
    Réponses: 4
    Dernier message: 19/12/2005, 21h11
  3. Réponses: 11
    Dernier message: 08/12/2005, 13h09
  4. Qt c++ Test d'une calculatrice à distance
    Par MonsieurAk dans le forum Linux
    Réponses: 6
    Dernier message: 25/11/2005, 11h49
  5. Aide à la réalisation d'une calculatrice en C
    Par Premium dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 17/11/2005, 16h52

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