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 :

Accepter 3 nombres après la virgule.


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut Accepter 3 nombres après la virgule.
    Bonjour à toutes et à tous,

    J affiche dans un gtk_label_new, un nombre décimal, mais ce nombre comporte trop de chiffres après la virgule et j aurais souhaité en avoir seulement trois après la virgule.

    J ai regardé dans la documentation et je n ai pas trouvé ou compris si il existait un gtk label qui me permettrait cela.

    Pourriez vous m indiquer un lien dans la documentation afin que je puisse essayer de résoudre mon problème.

    Merci par avance.

    Shazad

  2. #2
    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
    Avec printf, tu peux passer des arguments de format pour dire que tu veux juste quelques chiffres après la virgule.
    gchar *nb = g_strdup_printf ("%.03f", float_number); ou qque chose comme ça. Je te laisse lire la doc de printf pour trouver la syntaxe exacte

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Bonjour teuf13,

    Merci beaucoup pour ton exemple. J ai regardé la doc et je vais essayer de suite de le mettre en application.

    Shaz

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Bonjour à tous,

    J ai essayer avec g_strdup_printf et voilà ce que j ai fait comme 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
     
    void OnUpdate(GtkWidget *pEntry, gpointer data)
    {
        const gchar *sText;
        double diapason0;
        char strdiapason0[G_ASCII_DTOSTR_BUF_SIZE];
        MainWindow *pApp;
     
        pApp = (MainWindow*) data;
     
        sText = gtk_entry_get_text(GTK_ENTRY(pApp->pEntry));
        diapason0 = g_ascii_strtod(sText, NULL);
     
        diapason0 /= pow(2,1.0/12);
        g_strdup_printf(strdiapason0, "%.03f");
     
        g_ascii_dtostr (strdiapason0, sizeof (strdiapason0), diapason0);
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabel), strdiapason0);
    }
    Cela ne fonctionne pas pour l instant, je continue de chercher mon erreur.
    Dans la documentation on peux lire ceci pour le second paramètre de g_strdup_printf :

    " the parameters to insert into the format string "

    C est cet phrase que je ne comprends pas très bien.

    Shazad

  5. #5
    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
    Ca prend exactement les mêmes paramètres que printf, donc là c'est pas bon

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Bonjour teuf13,

    Je crois comprendre ce que tu veux dire, mais sur la doc on trouve cet fonction écrit comme cela:

    gchar* g_strdup_printf (const gchar *format,...);

    C est pour cela que j ai mis strdiapason0 en premier et ensuite le "%.03f".

    J avoue que là je dois avoir une grosse lacune et certainement un problème de compréhension de la doc.

    Je continue de chercher et de me creuser la tête.

    Shazad.

  7. #7
    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
    La chaîne de format, c'est justement le "%.03f". Si tu regardes la page de manuel de printf, la description est similaire.

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Alors si je fais comme mon premier exemple le compilateur ne me dis rien. J avoue que c est cela qui m a poussé à mettre strdiapason0 en première position.
    Mais si je fais cela:

    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 OnUpdate(GtkWidget *pEntry, gpointer data)
    {
        const gchar *sText;
        double diapason0;
        char strdiapason0[G_ASCII_DTOSTR_BUF_SIZE];
        MainWindow *pApp;
     
        pApp = (MainWindow*) data;
     
        sText = gtk_entry_get_text(GTK_ENTRY(pApp->pEntry));
        g_print("%s\n", sText);
        diapason0 = g_ascii_strtod(sText, NULL);
        g_print("%lf\n", diapason0);
     
        diapason0 /= pow(2,1.0/12);
        g_print("%lf\n", diapason0);
     
        g_strdup_printf("%.03lf", strdiapason0);
        g_print("%s\n", strdiapason0);
     
        g_ascii_dtostr (strdiapason0, sizeof (strdiapason0), diapason0);
        g_print("%s\n", strdiapason0);
        g_print("%lf\n", diapason0);
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabel), strdiapason0);
        g_print("%s\n", strdiapason0);
     
        g_free(strdiapason0);
    }
    Alors le compilateur affiche :

    warning: double format, pointer arg ( arg 2 )

    Donc, je ne comprend rien du tout. mdr. Je suis désolé d être autant un boulet.

    Shazad

  9. #9
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    J essais également d agir sur diapason0 comme ceci:

    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
    void OnUpdate(GtkWidget *pEntry, gpointer data)
    {
        const gchar *sText;
        double diapason0;
        char strdiapason0[G_ASCII_DTOSTR_BUF_SIZE];
        MainWindow *pApp;
     
        pApp = (MainWindow*) data;
     
        sText = gtk_entry_get_text(GTK_ENTRY(pApp->pEntry));
     
        diapason0 = g_ascii_strtod(sText, NULL);
     
        diapason0 /= pow(2,1.0/12);
        g_strdup_printf("%.03f", diapason0);
        g_print("%lf\n", diapason0);
     
        g_ascii_dtostr (strdiapason0, sizeof (strdiapason0), diapason0);
     
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabel), strdiapason0);
     
     
        g_free(strdiapason0);
    }
    Mais cela ne fonctionne pas. J ai toujours plus de trois chiffres après la virgule.

    Shazad

  10. #10
    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
    Pour faire la conversion en chaîne de caractère, soit tu utilises g_strdup_printf, soit tu utilise g_dtostr, mais tu ne peux pas utiliser les 2 en même temps...

  11. #11
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Je fais une petite récapitulation.
    Avec mon code de base :
    Je récupère la chaîne de caractères venant du Gtk entry dans sText.

    Je convertis grâce à g_ascii_strtod cet chaîne en nombre décimal afin de lui faire subir un calcul (diapason0).

    Je convertis le nombre décimal grâce à g_ascii_dtostr en chaîne de caractères dans strdiapason0, afin de pouvoir l envoyer au Gtk Label.

    Donc tu me dis, si je comprend bien, que je peux utiliser g_strdup_printf pour convertir en chaîne de caractères diapason0 (avec l option 3 chiffres après la virgule). Bon et bien si c est ça , je vais essayer.

    Encore merci pour ta patience.

    Shazad

  12. #12
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Donc si je me sert bien de la fonction g_strdup_printf, je fais ceci:

    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
    void OnUpdate(GtkWidget *pEntry, gpointer data)
    {
        const gchar *sText;
        double diapason0;
        char strdiapason0[G_ASCII_DTOSTR_BUF_SIZE];
        MainWindow *pApp;
     
        pApp = (MainWindow*) data;
     
        sText = gtk_entry_get_text(GTK_ENTRY(pApp->pEntry));
     
        diapason0 = g_ascii_strtod(sText, NULL);
     
     
        diapason0 /= pow(2,1.0/12);
        g_strdup_printf("%.03f", diapason0);
        /*g_ascii_dtostr (strdiapason0, sizeof (strdiapason0), diapason0);*/
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabel), diapason0);
     
     
        g_free(strdiapason0);
    }
    Mais maintenant j ai un problème avec gtk_label_set_text, car le compilateur m affiche:

    error: incompatible type for argument 2 of 'gtk_label_set_text'.

    Je me sens comme un rat en cage d un coup.

    Shazad

  13. #13
    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
    g_strdup_printf ne s'utilise pas comme ça... Tu as une variable de type "double" que tu passes en second argument à cette fonction, tu t'attends à ce qu'elle se transforme magiquement en variable de type char * ? g_strdup_printf a une valeur de retour que tu n'utilises pas... Dans ton cas, g_strtod me paraît plus adapté que g_ascii_strtod

  14. #14
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Voilà teuf13, j ai bien avancé grâce à tes explications.

    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
    void OnUpdate(GtkWidget *pEntry, gpointer data)
    {
        const gchar *sText;
        double diapason0;
     
        MainWindow *pApp;
     
     
        pApp = (MainWindow*) data;
     
     
        sText = gtk_entry_get_text(GTK_ENTRY(pApp->pEntry));
     
          diapason0 = g_ascii_strtod(sText, NULL);
        diapason0 /= pow(2,1.0/12);
     
        char *strdiapason0 = g_strdup_printf("%.03f", diapason0);
     
        g_print("%s\n", strdiapason0); /*613.518*/
     
        g_ascii_dtostr (strdiapason0, sizeof (strdiapason0), diapason0);
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabel), strdiapason0);
    }
    Avec l affichage du g_print dans la console j ai bien 613.518.
    Dans le gtk label, ce chiffre devient 613. Donc il me reste un problème à résoudre avec la fonction g_ascii_dtostr.
    J ai essayer le code avec g_strtod mais cela n a rien changé. Peux être encore un problème de compréhension de ma part.

    Shazad

  15. #15
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    C est là que l on comprend que mon cerveau est lent, car j ai enfin compris qu il fallait enlever g_ascii_dtostr. Encore une étourderie.

    Maintenant tout fonctionne comme je souhaite et cela grâce à ton aide.

    Je te remercie grandement pour ton aide.

    Shazad

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

Discussions similaires

  1. Ne laisser que 2 nombres aprés la virgule ou le point et supprimer les autres
    Par mystro7200 dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 18/07/2008, 18h16
  2. Limité les nombres après la virgule
    Par touchkad dans le forum Langage
    Réponses: 4
    Dernier message: 17/09/2007, 10h37
  3. Limiter les nombres après la virgule
    Par lebigboss dans le forum Langage
    Réponses: 3
    Dernier message: 24/07/2007, 11h39
  4. Comment limiter le nombre apres la virgule?
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 25/10/2006, 22h12
  5. [Math]Récupérer le premier nombre après la virgule
    Par am.adnane dans le forum Général Java
    Réponses: 4
    Dernier message: 01/12/2005, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo