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 :

récupération d'un entry


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut récupération d'un entry
    j'ai un petit souci avec un entry, je rentre dedans un nombre, ensuite je récupère ce que j'ai rentré et je suppose que je dois transcrire la chaine de caracteres en integer mais le porblem c'est que je n'es pas d'erreur mon programme s'éxécute mais quand je clique sur le boutton et que je rentre des valeur inférieur a 0.80 j'ai aucun message
    voici 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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
     
    void on_button3_clicked(GtkButton *button, gpointer data)
    {
      /*déclaration des variables*/
      GtkWidget *pinfo1;
      GSList *pListE;
      const gchar *sLabelE;
      GSList *pListA;
      const gchar *sLabelA;
      int compE=0;
      int compA=0;
      GtkWidget *pinfo3;
      GSList *pListPE;
      const gchar *sLabelPE;
      GSList *pListPA;
      const gchar *sLabelPA;
      int compPE=0;
      int compPA=0;
     
      /*On récupère les données des largeurs des portes
      /*pour la porte d'entrée*/
      GtkWidget *entryPE;  
      /*pour la porte des pièces*/
      GtkWidget *entryPP; 
      int valuePE = 0;
      int valuePP = 0;
      GtkWidget *pinfo2;
     
      /*on récupère ce que l'utilisateur a rentré pour les deux premières questions*/
     
      GtkWidget * radioE=lookup_widget(GTK_WIDGET(button),"radiobutton1");
      GtkWidget *radioA=lookup_widget(GTK_WIDGET(button),"radiobutton3");
     
    /*on récupère pour les questions concernant la porte d'entrée*/
     GtkWidget * radioPE=lookup_widget(GTK_WIDGET(button),"radiobutton11");
      GtkWidget *radioPA=lookup_widget(GTK_WIDGET(button),"radiobutton13");
     
     
      /* Recuperation de la liste des boutons */
      pListE = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioE));
      /* Parcours de la liste */
      while(pListE)
      {
        /* Le bouton est il selectionne */
        if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pListE->data)))
        {
          /* OUI -> on copie le label du bouton */
          sLabelE = gtk_button_get_label(GTK_BUTTON(pListE->data));
          /*On met la liste a NULL pour sortir de la boucle */
          pListE = NULL;
        }
        else
        {
          /* NON -> on passe au bouton suivant */
          pListE = g_slist_next(pListE);
        }
      }
     
      /* Recuperation de la liste des boutons */
      pListA = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioA));
      /* Parcours de la liste */
      while(pListA)
      {
        /* Le bouton est il selectionne */
        if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pListA->data)))
        {
          /* OUI -> on copie le label du bouton */
          sLabelA = gtk_button_get_label(GTK_BUTTON(pListA->data));
          /* On met la liste a NULL pour sortir de la boucle */
          pListA = NULL;
        }
        else
        {
        /* NON -> on passe au bouton suivant */
        pListA = g_slist_next(pListA);
        }
      }
     
      /* Recuperation de la liste des boutons */
      pListPE = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioPE));
      /* Parcours de la liste */
      while(pListPE)
      {
        /* Le bouton est il selectionne */
        if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pListPE->data)))
        {
          /* OUI -> on copie le label du bouton */
          sLabelPE = gtk_button_get_label(GTK_BUTTON(pListPE->data));
          /* On met la liste a NULL pour sortir de la boucle */
          pListPE = NULL;
        }
        else
        {
        /* NON -> on passe au bouton suivant */
        pListPE = g_slist_next(pListPE);
        }
      }
     
      /* Recuperation de la liste des boutons */
      pListPA = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radioPA));
      /* Parcours de la liste */
      while(pListPA)
      {
        /* Le bouton est il selectionne */
        if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pListPA->data)))
        {
          /* OUI -> on copie le label du bouton */
          sLabelPA = gtk_button_get_label(GTK_BUTTON(pListPA->data));
          /* On met la liste a NULL pour sortir de la boucle */
          pListPA = NULL;
        }
        else
        {
        /* NON -> on passe au bouton suivant */
        pListPA = g_slist_next(pListPA);
        }
      }
     
     
     
      /*on compare la réponse de l'escalier à OUI*/                 
      compE=strcmp(sLabelE,"oui"); 
      /*on compare la réponse de l'ascenseur avec oui*/
      compA=strcmp(sLabelA,"oui"); 
      /*si c'est différent, on écrit les lignes dans essai */             
      if((compE==0) && (compA!=0))
      {
      /*on regarde que s'il y a plusieurs étages alors il y a un ascenseur sinon on marque un message d'erreur*/
       pinfo1 = gtk_message_dialog_new (GTK_WINDOW(data),GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,"attention la personne ne peut pas acceder aux etages superieurs"); 
        /* Affichage de la boite de message */
        gtk_dialog_run(GTK_DIALOG(pinfo1));
        /* Destruction de la boite de message */
        gtk_widget_destroy(pinfo1);      
      } 
      /*else
      {
        pinfo1 = gtk_message_dialog_new (GTK_WINDOW(data),GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,"ok"); 
        /* Affichage de la boite de message */
        //gtk_dialog_run(GTK_DIALOG(pinfo1));
        /* Destruction de la boite de message */
        /*gtk_widget_destroy(pinfo1);
      }*/
     
    /*on compare la réponse de la porte d'entrée à OUI*/                 
      compPE=strcmp(sLabelPE,"oui"); 
      /*on compare la réponse de la porte accessible avec oui*/
      compPA=strcmp(sLabelPA,"oui"); 
     
     /*si c'est différent, on écrit les lignes dans essai */             
      if((compPE==0) && (compPA!=0))
      {
      /*si la porte d'entrée possèede une marche et qu'il n'y a pas d'autre entrée accessible on marque un message d'erreur*/
       pinfo3 = gtk_message_dialog_new (GTK_WINDOW(data),GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,"attention aucune entree n'est accessible puisqu'elles ont toutes une marche"); 
        /* Affichage de la boite de message */
        gtk_dialog_run(GTK_DIALOG(pinfo3));
        /* Destruction de la boite de message */
        gtk_widget_destroy(pinfo3);      
      } 
     
     /*On récupére ce que l'utilisateur a rentré*/                                        
      entryPE=lookup_widget(GTK_WIDGET(button),"entry14");
        /*On récupére ce que l'utilisateur a rentré*/                                        
      entryPP=lookup_widget(GTK_WIDGET(button),"entry15");
     
      /*on transcrit la chaine en un nombre*/
      valuePE = (int) strtol (entryPE, NULL,0);
      valuePP = (int) strtol (entryPP, NULL,0);
     
      if ((valuePE < 0.90) || (valuePP < 0.80))
      {
      /*si la largeur des portes n'est pas suffisante, on note un message d'erreur*/
       pinfo2 = gtk_message_dialog_new (GTK_WINDOW(data),GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,"attention la largeur d'une ou plusieurs portes n'est pas aux normes, regarder les normes");                
        /* Affichage de la boite de message */
        gtk_dialog_run(GTK_DIALOG(pinfo2));
        /* Destruction de la boite de message */
        gtk_widget_destroy(pinfo2);      
      }
    }
    merci
    pepsister

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      int valuePE = 0;
      int valuePP = 0;
      /*on transcrit la chaine en un nombre*/
      valuePE = (int) strtol (entryPE, NULL,0);
      valuePP = (int) strtol (entryPP, NULL,0);
     
      if ((valuePE < 0.90) || (valuePP < 0.80))
      {
    Un des premiers trucs à faire quand t'as un bug, c'est de commencer par trouver un programme le plus petit possible permettant de le reproduire. Souvent ça suffit pour comprendre ce qui ne va pas. Dans le cas présent, ça m'aurait évité d'avoir à parcourir tout le code pour retrouver l'endroit problématique en plus Et j'aurais tendance à dire qu'avec le code ci dessus, ce qui ne va pas se voit... Si tu n'as pas d'idée, je t'invite à réviser la définition d'un entier dans un livre de maths ou la définition d'un int dans ton bouquin de C

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    j'ai compris ce qui ne va pas,le problème c'est que mes chiffres sont à virgule, le programme ne considere que l'entier si je met 0.98 c'est bien supérieur a 0.90 mais lui il le traduit comme 0. Ca c'est ok je voudrais savoir dans ce cas comment transcrire ma chaine en un chiffre a virgule, je ne dois plus utiliser de strtol mais quoi? Je ne peux pas faire non plus de comparaison avec une chaine de caractere car moi je ne veux pas qu'on voit si c'est égale ou pas je veux qu'on sache si c'est inférieur ou supérieur. Donc que dois je utiliser? Comment faire?
    Est ce possible d'avoir une réponse explicite je dois rendre ce programme le 28

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    dsl beug de lordi javais pas fini
    je disais que je devais rendre ce programme le 28 au soir, j'aurais donc besoin d'une réponse assez explicite, je n'ai plus que ca qui bug dans mon programme.
    Merci beaucoup
    pepsister

  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
    Cool, on file un coup de main et en plus on a des deadlines. On touche une prime si on t'aide à résoudre ton pb ? Je te conseille de regarder g_strtod (qui est mentionné dans la page de manuel de strtol)

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par teuf13
    Cool, on file un coup de main et en plus on a des deadlines. On touche une prime si on t'aide à résoudre ton pb ? Je te conseille de regarder g_strtod (qui est mentionné dans la page de manuel de strtol)
    C'est un problème de locale, donc forcement il y aura toujours l'utilisateur qui a une locale avec le séparateur point est qui voudra utilisez la virgule (merci Murphy).

    Voilà un p'tit teste en C :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <locale.h>
     
    static void test_convert (const char *text, const char *local)
    {
      double num = 0;
      char *endptr = NULL;
     
      fprintf (stderr, "[%s] %s -> ", local, text);
      setlocale (LC_NUMERIC, local);
      num = strtod (text, &endptr);
      if (endptr == &text[3])
      {
        printf("%f\n", num);
      }
      else
      {
        fprintf (stderr, "Erreur au catactere '%.1s'\n", endptr);
      }
    }
     
    int main (void)
    {
      test_convert ("1.2", "C");
      test_convert ("1,2", "C");
      test_convert ("1.2", "fr");
      test_convert ("1,2", "fr");
      return EXIT_SUCCESS;
    }
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [C] 1.2 -> 1.200000
    [C] 1,2 -> Erreur au catactere ','
    [fr] 1.2 -> Erreur au catactere '.'
    [fr] 1,2 -> 1,200000

    Donc le mieux est de récupérer le séparateur utilisé (cf man localeconv) et remplacer le point ou la virgule par celui-ci (cf man strchr).

    Sinon tu fait comme dans excel tu averties l'utilisateur que ce qu'il a saisi n'est pas un nombre

Discussions similaires

  1. Entry, button et MainWindow..récupération dynamique d'entry
    Par bobydrack dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 06/06/2010, 11h42
  2. Entry récupération de variable
    Par rezuz dans le forum Tkinter
    Réponses: 17
    Dernier message: 09/09/2009, 21h24
  3. Réponses: 10
    Dernier message: 24/06/2009, 09h04
  4. Récupération du header dans l'entry point
    Par virulent dans le forum GWT et Vaadin
    Réponses: 0
    Dernier message: 03/06/2009, 12h49
  5. Récupération et réutilisation de valeurs GTK Entry
    Par Oursdeglace dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 11/05/2008, 21h50

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