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 :

Mauvaise compréhension de G_ASCII_DTOSTR_BUF_SIZE


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut Mauvaise compréhension de G_ASCII_DTOSTR_BUF_SIZE
    Bonjour,

    Voilà une partie du code que j ai écrit pour faire une application GTK.

    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 *entry, gpointer data)
    {
        const gchar *sText;
        gdouble diapason;
        MainWindow *pApp;
        char strdiapason[G_ASCII_DTOSTR_BUF_SIZE];
     
        pApp = (MainWindow*) data;
     
        /*Récupération de la valeur du spin button*/
        sText = gtk_entry_get_text(GTK_ENTRY(pApp->entry));
     
        /*Conversion en double*/
        diapason = g_ascii_strtod (sText, NULL);
     
        /*Ici, je fait un calcul sur diapason*/
     
        /*Conversion en string */
        g_ascii_dtostr (strdiapason, sizeof (strdiapason), diapason);
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[0]), strdiapason);
     
    }
    Je récupère dans sText une valeur décimal.
    Comme je souhaite modifier cette valeur avant de l afficher dans l interface, il faut que je convertis le const gchar* en double. Ce que je fais avec g_ascii_strtod.

    Le problème se passe avec g_ascii_dtostr, car je ne retrouve pas ma valeur initiale.
    Pourriez vous m aiguillez s il vous plaît.

    Merci par avance pour vos réponses.

    Shazad

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Si j fais un g_print pour voir la valeur de "diapason", elle est inférieur à la valeur que j ai entré par le biais du spin button.

    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 *entry, gpointer data)
    {
        const gchar *sText;
        gdouble diapason;
        MainWindow *pApp;
        char strdiapason[G_ASCII_DTOSTR_BUF_SIZE];
     
        pApp = (MainWindow*) data;
     
        /*Récupération de la valeur du spin button*/
        sText = gtk_entry_get_text(GTK_ENTRY(pApp->entry));
     
        /*Conversion en double*/
        diapason = g_ascii_strtod (sText, NULL);
        g_print("%lf\n", diapason);
     
        /*Ici, je fait un calcul sur diapason*/
     
        /*Conversion en string */
        g_ascii_dtostr (strdiapason, sizeof (strdiapason), diapason);
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[0]), strdiapason);
     
    }
    C est dans la conversion du gchar en double que se trouve le problème je pense.

    Shazad

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par shazad Voir le message
    Si j fais un g_print pour voir la valeur de "diapason", elle est inférieur à la valeur que j ai entré par le biais du spin button.
    Tu peux donner un exemple typique de ce que tu observes pour le spin button et pour diapason ?

  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 diogene,

    Et merci de m avoir répondu.

    Voilà où j en suis actuellement avec mon 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
     
    void OnUpdate(GtkWidget *entry, gpointer data)
    {
     
        const gchar *sText;
        double diapason;
        int i;
        MainWindow *pApp;
        char strdiapason[24];
     
        pApp = (MainWindow*) data;
     
     
        sText = gtk_entry_get_text(GTK_ENTRY(pApp->entry));
     
        g_print ("%s \n", sText);
     
        diapason = g_ascii_strtod (sText, NULL);
     
        g_print("%lf \n", diapason);
     
        for (i=0; i<24; i++)
        {
            diapason /= pow(2,1.0/12);
             /*Comment remplir le tableau strdiapason*/
     
        }
     
     
        g_ascii_dtostr (strdiapason, sizeof (strdiapason), diapason);
        g_print("%lf\n", diapason);
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[0]), strdiapason[0]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[1]), strdiapason[1]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[2]), strdiapason[2]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[3]), strdiapason[3]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[4]), strdiapason[4]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[5]), strdiapason[5]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[6]), strdiapason[6]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[7]), strdiapason[7]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[8]), strdiapason[8]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[9]), strdiapason[9]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[10]), strdiapason[10]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[11]), strdiapason[11]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[12]), strdiapason[12]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[13]), strdiapason[13]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[14]), strdiapason[14]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[15]), strdiapason[15]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[16]), strdiapason[16]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[17]), strdiapason[17]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[18]), strdiapason[18]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[19]), strdiapason[19]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[20]), strdiapason[20]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[21]), strdiapason[21]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[22]), strdiapason[22]);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[23]), strdiapason[23]);
     
     }
    Alors j ai remarqué qu il était normal que le résultat du spin button soit tronqué (2,54 devient 2), car il envoi à la fonction OnUpdate un nombre décimal avec virgule. Et je me souviens avoir appris qu'en C les nombres décimaux doivent être écrit avec un point. Peut être que je dis une bêtise.

    Si je met un gtk_entry_new à la place du spin_button, et que la valeur que je rentre est par exemple 12.54, cela m affiche 12.53999999999 dans le Gtk Label. Malgré que dans la console j ai bien 12.54000000. On m a conseillé d utiliser g_ascii_strup, mais je ne sais pas m en servir.

    J ai un dernier problème: j essaie de transformer strdiapason en tableau ( char strdiapason[24]; ) et de le remplir avec la boucle for.
    Je n arrive pas à le remplir, pourriez vous me mettre sur la voie.

    Le compilateur m affiche ceci à propos des lignes gtk_label_set_text:

    warning: passing arg 2 of 'gtk_label_set_text' makes pointer from integer without a cast.

    Je suis un peu perdu j avoue.

    Merci par avance de votre aide.

    Shazad

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Voilà la seule solution que j ai trouvé pour l instant, sans affoler le compilateur:

    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
    void OnUpdate(GtkWidget *entry, gpointer data)
    {
     
        const gchar *sText;
        double diapason;
        double diapason1;
        double diapason2;
        MainWindow *pApp;
        char strdiapason[G_ASCII_DTOSTR_BUF_SIZE];
        char strdiapason1[G_ASCII_DTOSTR_BUF_SIZE];
        char strdiapason2[G_ASCII_DTOSTR_BUF_SIZE];
     
        pApp = (MainWindow*) data;
     
     
        sText = gtk_entry_get_text(GTK_ENTRY(pApp->entry));
     
        g_print ("%s \n", sText);
     
        diapason = g_ascii_strtod (sText, NULL);
     
        g_print("%lf \n", diapason);
     
     
          diapason /= pow(2,1.0/12);
          diapason1 = diapason;
          diapason1 /= pow(2,1.0/12);
          diapason2 = diapason1;
          diapason2 /= pow(2,1.0/12);
     
        g_ascii_dtostr (strdiapason, sizeof (strdiapason), diapason);
        g_ascii_dtostr (strdiapason1, sizeof (strdiapason1), diapason1);
        g_ascii_dtostr (strdiapason2, sizeof (strdiapason2), diapason2);
        g_print("%lf\n", diapason);
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[0]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[1]), strdiapason1);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[2]), strdiapason2);
        /*gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[3]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[4]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[5]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[6]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[7]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[8]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[9]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[10]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[11]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[12]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[13]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[14]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[15]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[16]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[17]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[18]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[19]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[20]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[21]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[22]), strdiapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[23]), strdiapason);*/
     
     }

    Shazad

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    cela m affiche 12.53999999999 dans le Gtk Label. Malgré que dans la console j ai bien 12.54000000. On m a conseillé d utiliser g_ascii_strup, mais je ne sais pas m en servir
    C'est lié au fait que dans le cas général, les nombres flottants ne peuvent qu'être une approximation : toutes les valeurs ne peuvent être exactement représentées en flottant.

    warning: passing arg 2 of 'gtk_label_set_text' makes pointer from integer without a cast.
    C'est un warning grave et qui annonce une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        char strdiapason[24];
    ....
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[0]), strdiapason[0]);
    La fonction attend comme deuxième argument une chaine de caractère, donc un pointeur et reçoit strdiapason[0], soit un char, donc un entier

    * C'est quelque chose comme ça qui t'intéresse ou veux-tu conserver dans un tableau toutes les valeurs ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    rac12 =  pow(2,1.0/12);
    diapason = g_ascii_strtod (sText, NULL); 
    for(i= 0; i<24;i++)
    {
        diapason /= rac12;
        g_ascii_dtostr (strdiapason, sizeof (strdiapason), diapason);
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[0]), strdiapason); 
    }
    .

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

Discussions similaires

  1. [Python 2.X] Mauvaise compréhension du partage d'attributs en héritage de classes
    Par Chello dans le forum Général Python
    Réponses: 6
    Dernier message: 19/07/2014, 14h46
  2. Mauvaise compréhension de JOIN deux tables
    Par devjcc dans le forum Requêtes
    Réponses: 6
    Dernier message: 08/09/2010, 17h25
  3. Mauvaise compréhension de CssResource
    Par Eléonore23 dans le forum GWT et Vaadin
    Réponses: 5
    Dernier message: 26/07/2010, 17h00
  4. Réponses: 18
    Dernier message: 02/02/2010, 15h39
  5. mauvaise compréhension du "xor"
    Par dispa dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/11/2007, 09h07

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