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

C Discussion :

Calcul avec décimales


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 8
    Points
    8
    Par défaut Calcul avec décimales
    Bonjour,

    j'ai fait en collaboration avec un collègue un petit programme de calcul en langage C avec interface graphique GTK. Hélas le calcul se fait bien avec les nombres entiers mais ne prend pas en compte les décimales.

    voici le code :

    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <gtk/gtk.h>
     
     
    /*VARIABLES D'ENVIRONNEMENT*/
    GtkWidget * p_win    = NULL;
    GtkWidget * p_vbox   = NULL;
    GtkWidget * p_entry [3];
    GtkWidget * p_label [3];
    GtkWidget * p_button [1];
     
     
    typedef struct
    {
     
       double op1;
       double op2;
       double resultat;
     
     
    }
    operandes;
     
     
    void cb_activate (GtkEntry * p_wid, gpointer p_data)
    {
       GtkEntry * p_entry = (GtkEntry *) p_data;
     
       g_return_if_fail (p_wid != NULL);
       g_return_if_fail (p_data != NULL);
     
       gtk_widget_grab_focus (GTK_WIDGET (p_entry));
    }
     
     
    void cb_clicked (GtkButton * p_wid, gpointer p_data)
    {
       char buff [20];
       operandes * op = NULL;
     
       g_return_if_fail (p_wid != NULL);
       g_return_if_fail (p_data != NULL);
     
       op = (operandes *) p_data;
       op->op1 = strtod (gtk_entry_get_text (GTK_ENTRY (p_entry[0])), NULL);
       op->op2 = strtod (gtk_entry_get_text (GTK_ENTRY (p_entry[1])), NULL);
       op->resultat = op->op1 + op->op2;
     
       sprintf (buff, "%.3f", op->resultat);
       buff [strlen (buff) - 1] = '\0';
     
       gtk_entry_set_text (GTK_ENTRY (p_entry[2]), buff);
    }
     
     
    int main (int argc, char ** argv)
    {
       /*VARIABLES DE CALCUL*/
       operandes op;
     
     
       gtk_init (& argc, & argv);
     
     
       p_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
       gtk_window_set_title (GTK_WINDOW (p_win), "GtkEntry...");
       gtk_container_set_border_width (GTK_CONTAINER (p_win), 5);
     
       g_signal_connect (
          G_OBJECT (p_win), "destroy",
          G_CALLBACK (gtk_main_quit), NULL
       );
     
     
       p_vbox = gtk_vbox_new (TRUE, 5);
       gtk_container_add (GTK_CONTAINER (p_win), p_vbox);
     
     
       /*MISE EN PLACE DES ELEMENTS DE LA FENETRE*/
     
       p_entry[0] = gtk_entry_new ();
       p_entry[1] = gtk_entry_new ();
       p_entry[2] = gtk_entry_new ();
       p_label[0] = gtk_label_new("TAPEZ VOTRE 1er NOMBRE ");
       p_label[1]  = gtk_label_new("TAPEZ VOTRE 2eme NOMBRE ");
       p_label[2] = gtk_label_new("RESULTAT DE L'ADDITION =");
       p_button[0] = gtk_button_new_with_label("VALIDATION");
     
       gtk_entry_set_alignment (GTK_ENTRY (p_entry[0]), 1); 
       gtk_entry_set_alignment (GTK_ENTRY (p_entry[1]), 1);
       gtk_entry_set_alignment (GTK_ENTRY (p_entry[2]), 1);
     
       gtk_box_pack_start(GTK_BOX(p_vbox), p_label[0], TRUE, FALSE, 0);
       gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[0], TRUE, TRUE, 5);
       gtk_box_pack_start(GTK_BOX(p_vbox), p_label[1], TRUE, FALSE, 0);
       gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[1], TRUE, TRUE, 5);
       gtk_box_pack_start(GTK_BOX(p_vbox), p_button[0], TRUE, TRUE, 0);
       gtk_box_pack_start(GTK_BOX(p_vbox), p_label[2], TRUE, FALSE, 0);
       gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[2], TRUE, TRUE, 5);
     
     
       g_signal_connect (
          G_OBJECT (p_button[0]), "clicked",
          G_CALLBACK (cb_clicked), (void *) &op
       );
     
       g_signal_connect (
          G_OBJECT (p_entry[0]), "activate",
          G_CALLBACK (cb_activate), (GtkEntry *) p_entry[1]
       );
     
     
       gtk_widget_show_all (p_win);
       gtk_main ();
     
     
       return 0;
    }
    Quelqu'un aurait-il une explication à cela

    D'avance merci.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Ligne 489765 ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    J'ai parcouru très vite votre code (trop vite sans doute) et il apparaît que vous utilisez strtod pour les conversions texte->double.
    Ma question est sans doute stupide, mais tapez-vous bien '.' (et non ',') lorsque vous saisissez un nombre dans l'interface?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Oui je tape le point(.) comme séparateur de décimales lors de la saisie de nombre à virgule. J'ai essayé avec la virgule, mais ça ne fonctionne pas.

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par LE CORRE
    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
     
    /*VARIABLES D'ENVIRONNEMENT*/
    GtkWidget * p_win    = NULL;
    GtkWidget * p_vbox   = NULL;
    GtkWidget * p_entry [3];
    GtkWidget * p_label [3];
    GtkWidget * p_button [1];
     
    /* ... */
     
    int main (int argc, char ** argv)
    {
       gtk_init(&argc, &argv);
     
       /* ... */
     
       gtk_widget_show_all (p_win);
       gtk_main ();
     
       return 0;
    }
    Pourquoi utiliser toutes ces variables globales ici?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Essayez d'afficher les chaînes suivantes afin de voir si le nombre saisi est bien dedans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gtk_entry_get_text (GTK_ENTRY (p_entry[0]))
    gtk_entry_get_text (GTK_ENTRY (p_entry[1]))

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    aussi pourquoi cette ligne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       buff [strlen (buff) - 1] = '\0';
    si strlen marche, c'est que le '\0' existe....
    (ce qu'assure le sprintf)

    Quant au problème de fond, je ne sais pas, mais si ça ne veut pas marcher, moi j'essaierais sscanf ...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Essayez d'afficher les chaînes suivantes afin de voir si le nombre saisi est bien dedans:

    non cela ne s'affiche pas !

    quand je tape 12.5 dans le premier nombre et que je clique sur le bouton VALIDATION sans saisir de deuxième nombre, le programme me donne 12.00

  9. #9
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Essayez d'afficher les chaînes suivantes afin de voir si le nombre saisi est bien dedans:

    non cela ne s'affiche pas !

    quand je tape 12.5 dans le premier nombre et que je clique sur le bouton VALIDATION sans saisir de deuxième nombre, le programme me donne 12.00
    Ce qui est actuellement affiché par votre programme est la valeur d'un double résultant d'un calcul. Je vous suggère de modifier votre programme afin de voir ce que contiennent les chaînes suivantes (j'ai bien dit les chaînes, avant la conversion en double avec strtod):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gtk_entry_get_text (GTK_ENTRY (p_entry[0]))
    gtk_entry_get_text (GTK_ENTRY (p_entry[1]))

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par LE CORRE
    j'ai fait en collaboration avec un collègue un petit programme de calcul en langage C avec interface graphique GTK. Hélas le calcul se fait bien avec les nombres entiers mais ne prend pas en compte les décimales.
    A part l'absurdité signalée ici , le code est correct. Il faut juste penser à l'utiliser correctement. En français, le séparateur, c'est ',' et non '.' ...

    Win32 (XP avec GTK 2.10)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    12.34 + 56.78 = 68,00
     
    12,34 + 56,78 = 69,12
    PS : J'ai du isoler ce code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #if 0
       gtk_entry_set_alignment (GTK_ENTRY (p_entry[0]), 1);
       gtk_entry_set_alignment (GTK_ENTRY (p_entry[1]), 1);
       gtk_entry_set_alignment (GTK_ENTRY (p_entry[2]), 1);
    #endif
    car cette fonction est inconnue chez moi, pour une raison que j'ignore...
    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
     
    Project   : GTK+
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\gtk2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    In file included from C:/CodeBlocks/include/gtk-2.0/gtk/gtk.h:90,
                     from main.c:4:
    C:/CodeBlocks/include/gtk-2.0/gtk/gtkitemfactory.h:46: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:59: warning: implicit declaration of function `gtk_entry_set_alignment'
    Linking executable: C:\dev\wingui\gtkapp.exe
    .objs\main.o: In function `main':
    C:/dev/gtk2/main.c:59: undefined reference to `gtk_entry_set_alignment'
    C:/dev/gtk2/main.c:60: undefined reference to `gtk_entry_set_alignment'
    C:/dev/gtk2/main.c:61: undefined reference to `gtk_entry_set_alignment'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 10 seconds)
    3 errors, 2 warnings
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Il faut juste penser à l'utiliser correctement. En français, le séparateur, c'est ',' et non '.' ...
    Pouvez-vous développer davantage l'explication? Pour moi, strtod() utilise le point comme séparateur partie entière / décimale.

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par stephl
    Pouvez-vous développer davantage l'explication? Pour moi, strtod() utilise le point comme séparateur partie entière / décimale.
    Non, ça dépend de la localisation. Si gtk+ a détecté un mode "FR", strtod() attend une ',' comme séparateur...

    WG14/N1124 Committee Draft — May 6, 2005 ISO/IEC 9899:TC2
    7.20.1.3 The strtod, strtof, and strtold functions
    <...>
    4 If the subject sequence has the expected form for a floating-point number, the sequence of
    characters starting with the first digit or the decimal-point character (whichever occurs
    first) is interpreted as a floating constant according to the rules of 6.4.4.2, except that the
    decimal-point character is used in place of a period, and that if neither an exponent part
    nor a decimal-point character appears in a decimal floating point number, or if a binary
    exponent part does not appear in a hexadecimal floating point number, an exponent part
    of the appropriate type with value zero is assumed to follow the last digit in the string. If
    the subject sequence begins with a minus sign, the sequence is interpreted as negated.252)
    <...>
    6 In other than the "C" locale, additional locale-specific subject sequence forms may be
    accepted.
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Il me semble que ce n'est pas le fonctionnement standard de strtod, si?

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par stephl
    Il me semble que ce n'est pas le fonctionnement standard de strtod, si?
    Le fonctionnement par défaut ("C") peut être altéré par la localisation ("fr_FR")

    http://man.developpez.com/man3/setlocale.3.php
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Hélas pour moi ni le point ni la virgule ne donne accés au décimales pour l'addition des deux nombres.

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Ce qui est actuellement affiché par votre programme est la valeur d'un double résultant d'un calcul. Je vous suggère de modifier votre programme afin de voir ce que contiennent les chaînes suivantes (j'ai bien dit les chaînes, avant la conversion en double avec strtod):

    Je viens de la faire en modifiant le code :

    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <gtk/gtk.h>
     
     
    /*VARIABLES D'ENVIRONNEMENT*/
    GtkWidget * p_win    = NULL;
    GtkWidget * p_vbox   = NULL;
    GtkWidget * p_entry [3];
    GtkWidget * p_label [3];
    GtkWidget * p_button [1];
    const gchar *sText;
     
     
    typedef struct
    {
     
       double op1;
       double op2;
       double resultat;
     
     
    }
    operandes;
     
     
    void cb_activate (GtkEntry * p_wid, gpointer p_data)
    {
       GtkEntry * p_entry = (GtkEntry *) p_data;
     
       g_return_if_fail (p_wid != NULL);
       g_return_if_fail (p_data != NULL);
     
       gtk_widget_grab_focus (GTK_WIDGET (p_entry));
    }
     
     
    void cb_clicked (GtkButton * p_wid, gpointer p_data)
    {
       char buff [20];
       operandes * op = NULL;
     
       g_return_if_fail (p_wid != NULL);
       g_return_if_fail (p_data != NULL);
     
       op = (operandes *) p_data;
       op->op1 = strtod (gtk_entry_get_text (GTK_ENTRY (p_entry[0])), NULL);
       op->op2 = strtod (gtk_entry_get_text (GTK_ENTRY (p_entry[1])), NULL);
       op->resultat = op->op1 + op->op2;
     
     
       /*RETRAIT DU BUFFER
     
       sprintf (buff, "%.3f", op->resultat);
       buff [strlen (buff) - 1] = '\0';
       
       gtk_entry_set_text (GTK_ENTRY (p_entry[2]), buff);*/
     
     
     
     /*Recuperation du texte contenu dans le GtkEntry */
        sText = gtk_entry_get_text(GTK_ENTRY(p_entry[1]));
        gtk_entry_set_text(GTK_ENTRY(p_entry[2]), sText);
    }
     
     
    int main (int argc, char ** argv)
    {
       /*VARIABLES DE CALCUL*/
       operandes op;
     
     
       gtk_init (& argc, & argv);
     
     
       p_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
       gtk_window_set_title (GTK_WINDOW (p_win), "GtkEntry...");
       gtk_container_set_border_width (GTK_CONTAINER (p_win), 5);
     
       g_signal_connect (
          G_OBJECT (p_win), "destroy",
          G_CALLBACK (gtk_main_quit), NULL
       );
     
     
       p_vbox = gtk_vbox_new (FALSE, 5);
       gtk_container_add (GTK_CONTAINER (p_win), p_vbox);
     
     
       /*MISE EN PLACE DES ELEMENTS DE LA FENETRE*/
     
       p_entry[0] = gtk_entry_new ();
       p_entry[1] = gtk_entry_new ();
       p_entry[2] = gtk_entry_new ();
       p_label[0] = gtk_label_new("TAPEZ VOTRE 1er NOMBRE ");
       p_label[1]  = gtk_label_new("TAPEZ VOTRE 2eme NOMBRE ");
       p_label[2] = gtk_label_new("RESULTAT DE L'ADDITION =");
       p_button[0] = gtk_button_new_with_label("VALIDATION");
    p_label[2] = gtk_label_new("");
     
     
     
     
     
     
       gtk_entry_set_alignment (GTK_ENTRY (p_entry[0]), 1); 
       gtk_entry_set_alignment (GTK_ENTRY (p_entry[1]), 1);
       gtk_entry_set_alignment (GTK_ENTRY (p_entry[2]), 1);
     
       gtk_box_pack_start(GTK_BOX(p_vbox), p_label[0], TRUE, FALSE, 0);
       gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[0], TRUE, TRUE, 5);
       gtk_box_pack_start(GTK_BOX(p_vbox), p_label[1], TRUE, FALSE, 0);
       gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[1], TRUE, TRUE, 5);
       gtk_box_pack_start(GTK_BOX(p_vbox), p_button[0], TRUE, TRUE, 0);
       gtk_box_pack_start(GTK_BOX(p_vbox), p_label[3], TRUE, TRUE, 5);
       gtk_box_pack_start (GTK_BOX (p_vbox), p_entry[2], TRUE, TRUE, 5);
     
     
     
     
     
     
       g_signal_connect (
          G_OBJECT (p_button[0]), "clicked",
          G_CALLBACK (cb_clicked), (void *) &op
       );
     
       g_signal_connect (
          G_OBJECT (p_entry[0]), "activate",
          G_CALLBACK (cb_activate), (GtkEntry *) p_entry[1]
       );
     
     
       gtk_widget_show_all (p_win);
       gtk_main ();
     
     
       return 0;
    }
    les deux nombres sont bien retourné avec les décimales.
    Pourquoi est ce que la fonction de calcul ne les prend pas compte ?

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par LE CORRE
    Pourquoi est ce que la fonction de calcul ne les prend pas compte ?
    Je n'en ai aucune idée , mais comme je l'avais déjà suggéré pourquoi ne pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       sscanf (gtk_entry_get_text (GTK_ENTRY (p_entry[0])), "%lf", &op->op1);
       sscanf (gtk_entry_get_text (GTK_ENTRY (p_entry[1])), "%lf", &op->op2);
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 8
    Points
    8
    Par défaut
    Salut,

    tu avais raison avec sscanf, ça fonctionne. j'ai modifié le code en mettant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sscanf (gtk_entry_get_text (GTK_ENTRY (p_entry[0])), "%lf", &op->op1);
       sscanf (gtk_entry_get_text (GTK_ENTRY (p_entry[1])), "%lf", &op->op2);
     
     
     
     
       sprintf (buff, "%.3f", op->resultat);
       buff [strlen (buff) - 1] = '\0';
     
       gtk_entry_set_text (GTK_ENTRY (p_entry[2]), buff);
    Avec quand même comme modification la virgule comme séparateur décimal.

    Quelqu'un connait-il la valeur à mettre dans le SETLOCAL pour avoir le point à la place de la virgule ?

    D'avance merci.

Discussions similaires

  1. Question pour faire un calcul avec décimales
    Par rose0729 dans le forum IHM
    Réponses: 5
    Dernier message: 29/09/2012, 22h09
  2. [XL-2003] VBA - Calculer avec précision décimale
    Par Lorenzole+bo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/01/2010, 16h16
  3. XSL problème de calcul avec décimales
    Par jejelafrite dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 08/07/2007, 21h53
  4. Probl avec décimales s/ base Access et D7
    Par bzh56 dans le forum Bases de données
    Réponses: 2
    Dernier message: 29/07/2005, 12h36
  5. Réponses: 2
    Dernier message: 22/03/2004, 10h50

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