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
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
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:
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.
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); }
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
Bon bin faut croire que c'est g_ascii_dtostr qui est bogué :
Résultat :
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; }
Voilà enfin une bonne raison de ne pas utiliser g_ascii_dtostr
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![]()
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:
Je récupère cela dans la console:
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); }
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
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
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; }
Utilisation de Glade avec Gtk+
Code::Blocks et Gtk+ sous Windows
Programmation orientée objet avec Gtk+ v3
- N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk
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
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.
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.
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
Il a dit exactement l'inverse... Extrait de la doc de g_ascii_strtod:
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.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.
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
C'est toujours sympa d'avoir des gens qui disent merci![]()
Partager