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 :

Effectuer un calcul sur un GtkEntry


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Par défaut Effectuer un calcul sur un GtkEntry
    Bonjour à tous,

    Donc je vous explique mon problème...
    J'ai dans une fenetre un gtk_entry et un boutton..

    L'utilisateur est senser entre un prix d'achat et lorsqu'il clique sur le bouton, il execute le calcule pour avoir le prix final, et va changer la valeur de mon gtk_entry en y affichant le resultat...

    Seulement le problème est le suivant :
    - cela fonctionne, mais il ne prend pas en compte les chiffre derrière la virgule ( si j'entre 9 ou 9.99 cela me donne le meme resultat)
    - Secondo il me donne une erreur de segmentation dans la console...

    Voici le code et dite moi se que vous en pensser

    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
    void Btn_Calcul_Prix()
    {
    const char *text = NULL;
    double Entre = 0, Calc1 = 0, Result = 0;
     
    text = gtk_entry_get_text(GTK_ENTRY(pEntryWPrix));
    Entre = strtol (text, NULL, 10);
    Calc1 = Entre / 0.6;
    Result = Calc1 * 1.21;
     
    char *Retour;
    sprintf(Retour,"%0.2f",Result);
     
    gtk_entry_set_text(GTK_ENTRY(pEntryWPrix),Retour);
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Surement un problème de police. Pour confirmer essaies de mettre une virgule à la place du point.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Surement un problème de police. Pour confirmer essaies de mettre une virgule à la place du point.
    Sa fait la même choses :s

  4. #4
    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
    Tu utilises mal sprintf (son utilisation est d'ailleurs à bannir autant que possible . Je t'invite à regarder du côté de g_strdup_printf (n'oublie pas de faire un g_free sur la chaîne de caractère renvoyée quand tu n'en as plus besoin).

    strtol renvoie un entier, donc tu demandes explicitement au système de te fournir en entier, ça serait un bug s'il te donnait un nombre flottant Regarde du côté de strtof/strtod plutôt.

    En ce qui concerne les avis sur le code, je n'utiliserais qu'une seule variable flottante pour faire tous les calculs vus que les résultats intermédiaires n'ont pas l'air de t'être utiles.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Tu utilises mal sprintf (son utilisation est d'ailleurs à bannir autant que possible . Je t'invite à regarder du côté de g_strdup_printf (n'oublie pas de faire un g_free sur la chaîne de caractère renvoyée quand tu n'en as plus besoin).

    strtol renvoie un entier, donc tu demandes explicitement au système de te fournir en entier, ça serait un bug s'il te donnait un nombre flottant Regarde du côté de strtof/strtod plutôt.
    Ok merci je vais regarder a sa...

    Citation Envoyé par teuf13 Voir le message
    En ce qui concerne les avis sur le code, je n'utiliserais qu'une seule variable flottante pour faire tous les calculs vus que les résultats intermédiaires n'ont pas l'air de t'être utiles.
    Sinon jme doute, mais c'etait pour etre plus claire je remet tout en un calcul apres..

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Par défaut

    Pourriez vous eventuellement me montrer dans mon vout de code comment je doit utiliser strtod ou strtof car je ne parvien pas a compiler en utilisant ceci.

    Autre problème, j'ai essayer de compiler sur une autre machine... sa compile mais alors la sa calcul plus rien sa me donne une erreur de segmentation???

    Je suis perdu

  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
    Si t'as encore le sprintf, c'est normal les erreurs de segmentation... Pour strtof/strtod, sans voir les msgs d'erreur, je peux pas aider

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Si t'as encore le sprintf, c'est normal les erreurs de segmentation..
    Pourtant, avec le meme code sur mon portable sa tourne sauf que j'ai aucune precision... Mais sur les Workstation au boulot sa me met Erreur de segmentation... (peut etre la glib trop ancienne.. aller savoir)

    Sinon rectification, Si j'utilise :
    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
     
    void Btn_Calcul_Prix()
    {
    const char *text = NULL;
    double Entre = 0, Calc1 = 0, Result = 0;
     
    text = gtk_entry_get_text(GTK_ENTRY(pEntryWPrix));
    Entre = atof (text);// je perd ma precision ici
    Calc1 = Entre / 0.6;
    Result = Calc1 * 1.21;
     
    char *Retour;
    sprintf(Retour,"%0.2f",Result);
     
    gtk_entry_set_text(GTK_ENTRY(pEntryWPrix),Retour);
     
    }
    Sa fonctionne, mais il faut quand meme que je mette une virgule et pa un point, sinon sa passe pas... Existerait-il un moyen pour convertir le point en virgule ou de faire en sorte que cela passe aussi avec un point?

    Et alors que pensser vous du faite que sa foire sur la vielle debian qu'il y a sur les Workstation au boulot?

  9. #9
    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
    Bon, écoute, encore une fois, ton utilisation de sprintf est erronnée, tu corromps la mémoire de ton programme, ce qui conduit à des plantages aléatoires. Donc le comportement que tu obtiens est parfaitement normal! Je t'encourage une nouvelle fois à oublier ce sprintf et à utiliser g_strdup_printf à la place.
    Pour ces histoires de . et de , tu peux utiliser g_ascii_strtod qui attend un . mais je te rappelle qu'en France on met une virgule pour séparer la partie entière de la partie décimale d'un nombre Sur un système en anglais, strtod s'attendra à avoir un point.

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    mais je te rappelle qu'en France on met une virgule pour séparer la partie entière de la partie décimale d'un nombre Sur un système en anglais, strtod s'attendra à avoir un point.
    Je suis belge :p.. on fait jamais comme les autres

    Ok ben pour le reste je vais voir avec se que tu ma dit ;-)

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Par défaut
    Bon ben avec Il garde la precision avec le point... IL ne me reste plus a la limite de faire une espece de condition qui check si c'est une virgule ou un point qui a été entré, et le tour est joué

    Je mettrai le code final ici pour les autres qui comme moi on eu des difficulté. Ainsi il pourons voir comment on peut procéder

    Encore Merci

    PS: Pour se qui est des workstation au boulot elles vont etres reinstaller en Ubuntu 8.10, avec les dernière version des lib, donc sa devra fonctionner ;-)

  12. #12
    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
    Citation Envoyé par dogua Voir le message
    PS: Pour se qui est des workstation au boulot elles vont etres reinstaller en Ubuntu 8.10, avec les dernière version des lib, donc sa devra fonctionner ;-)

    Si par là tu veux dire que la mise à jour va corriger les pbs de plantage de ton appli à cause du sprintf, ne t'étonne pas si ton programme se met à planter le jour où tu rajoutes une nouvelle fonction ou bien où tu réorganises un peu le code...

Discussions similaires

  1. [Débutant] Ouvrir et effectuer des calculs sur un fichier txt
    Par vanniche dans le forum MATLAB
    Réponses: 16
    Dernier message: 08/10/2014, 13h28
  2. Effectuer un calcul sur un champ qui doit être filtrer
    Par lavoiej dans le forum Formules
    Réponses: 0
    Dernier message: 15/04/2010, 11h13
  3. Effectuer des calculs sur Access 07
    Par aldébaranjr dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/05/2009, 10h08
  4. Réponses: 5
    Dernier message: 06/07/2007, 18h59
  5. Réponses: 3
    Dernier message: 19/12/2006, 17h43

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