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 :

Recuperer une entrée.


Sujet :

GTK+ avec C & C++

  1. #21
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Oui effectivement j aurais pu réfléchir un peu plus pour le print car je connais les spécificateurs, mais j étais resté que le fait que c était un nombre qui venait du spin button. Grosse erreur de ma part.

    Shazad

  2. #22
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Je me permet de solliciter à nouveau votre aide car je pense que j approche du but. J ai corrigé mes erreurs en même temps.

    Voilà ce que j ai écrit et qui fonctionne avec un gtk_entry_new dans lequel je saisi mon nombre décimal:

    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 *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));
        g_print("%s\n", sText);
        /*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);
     
    }
    Je dois écrire un nombre décimal comme cela (12.53) pour que l affichage soit à peu près correct dan le gtk_Label. Il faut un point.

    Avec le spin button le nombre serais comme cela 12,53. Et là ça ne fonctionne pas.

    ce que je ne comprends pas encore c est que dans le Gtk Label il s affiche :
    12.529999999999, alors que dans la console j ai bien 12.53000000.

    Dois je faire abstraction de ce que je vois dans le Gtk Label et prendre en compte ce que j ai dans la console ?

    Shazad

  3. #23
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Bon bin faut croire que c'est g_ascii_dtostr qui est bogué :
    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
    #include <glib.h>
    #include <stdio.h>
     
    int main (int argc,
              char* argv[])
    {
            gdouble value = 12.53L;
            gchar strvalue[G_ASCII_DTOSTR_BUF_SIZE];
            gchar * strvalue2;
     
            g_debug ("value = %lf", value);
     
            g_ascii_dtostr (strvalue, sizeof (strvalue), value);
            g_debug ("g_ascii_dtostr (%lf) = %s", value, strvalue);
     
            snprintf (strvalue, sizeof (strvalue), "%lf", value);
            g_debug ("snprintf (%lf) = %s", value, strvalue);
     
            strvalue2 = g_strdup_printf ("%lf", value);
            g_debug ("g_strdup_printf (%lf) = %s", value, strvalue2);
     
            return 0;
    }
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [luis@donald double-convert]$ ./double-convert 
    ** (process:18514): DEBUG: value = 12.530000
    ** (process:18514): DEBUG: g_ascii_dtostr (12.530000) = 12.529999999999999
    ** (process:18514): DEBUG: snprintf (12.530000) = 12.530000
    ** (process:18514): DEBUG: g_strdup_printf (12.530000) = 12.530000
    Voilà enfin une bonne raison de ne pas utiliser g_ascii_dtostr

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

    Donc j ai 2 problèmes qui se posent à moi. Je voulais utiliser un spin button pour que l utilisateur ne rentre rien d autre qu un nombre décimal, mais quand je fais ça:

    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 *entry, gpointer data)
    {
     
        const gchar *sText;
        double diapason;
        MainWindow *pApp;
        char strdiapason[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);
     
        g_ascii_dtostr (strdiapason, sizeof (strdiapason), diapason);
        g_print("%lf\n", diapason);
     
        gtk_label_set_text(GTK_LABEL(pApp->pLabelAffichage1[0]), strdiapason);
     
     
    }
    Je récupère cela dans la console:



    Et donc on peux dire que g_ascii_strtod tronque les nombre décimaux avec virgule.

    Si je remplace le spin button par un gtk entry il faudrais que j empêche l utilisateur de mettre une virgule si il à besoin de rentrer un nombre décimal.

    Et même si il rentre son nombre décimal comme cela :12.53 par exemple, j ai le problème avec g_ascii_dtostr.

    Peux tu m indiquer comment utiliser g_ascii_strup pour mon application s il te plaît libeforce. J essaierai plus tard de trouver une façon d empêcher l utilisateur de mettre un nombre décimal avec une virgule.

    Shazad

  5. #25
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    L application que je souhaite faire existe déjà et est proposé sur une page internet. Si je rentre un chiffre avec une virgule et non pas un point, toutes ces applications plante aussi. Donc j en déduis qu il est normal de mettre un point.
    Mais ça si je me souviens bien c est une caractéristique du C, qui dit que les nombres décimaux doivent être écrit avec un point et non pas une virgule.

    Shazad

  6. #26
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    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 315
    Billets dans le blog
    5
    Par défaut
    Je te donne un exemple complet sur une façon de limiter la saisie dans un GtkEntry. A toi de le modifier selon tes besoins:
    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
    #include <gtk/gtk.h>
     
    void EntryChange(GtkEditable *editable, gpointer data)
     
    {
     
    	gchar *texte=NULL;								// texte récupéré du GtkEntry
    	gchar *car=NULL;									// Caratère testé.
     
    	const gchar *chaine="1234567890.";//chaine avec les valeurs désirées
     
     
    	// On bloque l'écoute du GtkEntry. Evite un double appel.
     
    	g_signal_handlers_block_by_func(editable, (gpointer)EntryChange,data);
     
    	// Récupération du dernier caractère entré.
     
    	texte=gtk_editable_get_chars(editable, 0, -1);
    	car=texte+g_utf8_strlen(texte,-1)-1;
     
     
    	if(!g_strrstr(chaine, car))
    	{
    		// Suppression de la lettre.
    		gtk_editable_delete_text(editable, g_utf8_strlen(texte,-1)-1, -1);
     
    	}
     
     
    	// On autorise à nouveau l'écoute.
    	g_signal_handlers_unblock_by_func(editable, (gpointer)EntryChange,data);
     
    	g_free(texte);
     
    }
     
    int main(int argc, char **argv)
    {
    	GtkWidget *pWindow=NULL;
    	GtkWidget *entry=NULL;
     
    	gtk_init(&argc, &argv);
     
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     
     
    	entry=gtk_entry_new();
    	g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(EntryChange), NULL);
     
    	gtk_container_add(GTK_CONTAINER(pWindow), entry);
     
    	gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER_ALWAYS);	
    	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     
    	gtk_widget_show_all(pWindow); 
     
     
    	gtk_main();
     
    	return 0;
    }

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

    Ton code est absolument fabuleux.
    Je vais essayer de l adapter au mien de suite, enfin ce soir quand j aurais fini le boulot.

    Un grand merci.

    Shaz

  8. #28
    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_ascii_strtod est justement faite pour chercher un "." comme séparateur décimal. Si tu veux que le séparateur décimal reconnu soit le séparateur usuel dans ta langue (ie la "," en français), strtod te fera ça.

  9. #29
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par shazad Voir le message
    Mais ça si je me souviens bien c est une caractéristique du C, qui dit que les nombres décimaux doivent être écrit avec un point et non pas une virgule.
    Ce n'est pas une caractéristique du C, le séparateur décimal dépend de la langue utilisée. En anglais, c'est un point. En français, c'est une virgule. C'est pour ça que la touche '.' du pavé numérique produit une virgule dans un tableur dans un environnement en français par exemple.

    Or le langage C est en anglais, je ne t'apprends rien. C'est pour ça que dans le code, on utilise le point comme séparateur décimal. Mais tu n'es absolument pas obligé quand ton nombre est sous forme de chaîne de caractère de garder ce point, cela peut être une virgule. Tout dépendra de la fonction qui fait la conversion nombre -> chaîne de caractères. Si elle prend en compte la locale (la langue) alors tu auras une virgule si ton ordinateur est configuré en français, et un point s'il est configuré en anglais.

  10. #30
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Par défaut
    Bonsoir,

    Veux tu dire teuf13 qu il y a une fonction dans g_ascii_strtod qui permet d éviter à l utilisateur de mettre une virgule ?

    Merci pour ta précision libeforce quand à l usage du point et de la virgule.

    Shazad

  11. #31
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par shazad Voir le message
    Veux tu dire teuf13 qu il y a une fonction dans g_ascii_strtod qui permet d éviter à l utilisateur de mettre une virgule ?
    Il a dit exactement l'inverse... Extrait de la doc de g_ascii_strtod:
    This function is typically used when reading configuration files or other non-user input that should be locale independent. To handle input from the user you should normally use the locale-sensitive system strtod() function.
    Si tu dois traiter des nombre ayant des virgules en français, et des points en anglais tu est dépendant de la locale. Et donc la documentation t'indique explicitement d'utiliser strtod qui s'adapte à ta locale.

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

    Je n avais pas pu mettre de messages depuis trois jours, mais j en fait un pour remercier toutes les personnes qui m ont aidé. Mon interface est terminé.

    Merci à tous.

    Shaz

  13. #33
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    C'est toujours sympa d'avoir des gens qui disent merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Recuperer une entrée par rapport a sa date
    Par bastian06n dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/09/2010, 16h36
  2. Recuperer une entrée utilisateur
    Par batama dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 25/09/2008, 13h51
  3. [SAX] Recuperer une chaine XML entre balises avec SAX
    Par Ange-Louis dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 01/08/2008, 10h33
  4. [Stratégie] Récupérer une instance existante
    Par cmoulin dans le forum Général Java
    Réponses: 14
    Dernier message: 11/05/2004, 15h48
  5. comment recuperer une variable dans flash
    Par krépuscul dans le forum Flash
    Réponses: 30
    Dernier message: 16/10/2003, 09h40

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