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 GtkEntry dans une structure


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 17
    Par défaut récupération d'un GtkEntry dans une structure
    Bonjour, je programme actuellement une fenêtre pour récupérer le nom de 2 joueurs, et j'ai un problème de compilation... invalid use of flexible array member qu'il me dit le méchant compilateur!

    Voici le signal que je connecte au bouton blancer dans ma fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    g_signal_connect ((gpointer) blancer, "clicked",
                        G_CALLBACK (on_blancer_clicked),
                        joueura, joueurb, commencerpartie);
    et voici la fonction on_blancer_clicked appelée :
    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
     
    void on_blancer_clicked                     (GtkButton       *button,
                                            GtkWidget *nom1, GtkWidget *nom2, 
                                            gpointer user_data)
    {
     Joueur joueur1;
     Joueur joueur2;
     
     joueur1.nom = gtk_entry_get_text(GTK_ENTRY(nom1));
     joueur2.nom = gtk_entry_get_text(GTK_ENTRY(nom2));
     
     initialiser (joueur1, joueur2);
     gtk_widget_destroy(user_data);
     lancerPartie(joueur1, joueur2);
     
    }
    enfin voici la définition du type Joueur dont je veux récupérer les noms

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct{
      int couleur;
      int compteur;
      ListeDeCartes jeux;
      char nom[];
        }  Joueur;
    C'est donc dans les lignes où j'appelle gtk_entry_get_text que j'ai un problème. Pourtant j'ai bien des char de chaque côté, donc je ne vois pas ce qui cloche...

    Merci d'avance pour l'aider que vous pourrez m'apporter!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Par défaut
    Citation Envoyé par Florent23 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g_signal_connect ((gpointer) blancer, "clicked",
    G_CALLBACK (on_blancer_clicked),
    joueura, joueurb, commencerpartie);
    Ça tu vois, c'est ce qu'on rêverait tous de faire
    Malheureusement, tu ne peux passer qu'un seul et unique argument dans ta Callback (généralement, on utilise une structure, un tableau, ou une liste pour passer plusieurs variables).

    De plus, le résultat de gtk_entry_get_text doit être copié dans une zone mémoire que tu auras allouée préalablement (y a un topic récent à ce propos).


    PS : oublies pas les balises [CODE]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    Salut,

    Pense à utiliser la balise [code], ce n'est vraiment pas très lisible là.

    Pour ce qui est de ton code... excuse-moi, mais il est bourré de fautes

    En C, on ne peux initialiser un tableau statique avec = qu'à la déclaration, dans ton cas il faut que tu utilise soit des tableau alloués dynamiquement, soit des tableaux à taille fixe et une boucle pour assigner la chaîne.

    Ensuite, gtk_entry_get_text() renvoie un const char* qui est explicitement défini par la documentation comme privé au widget, et ne devant pas être stocké, modifié ou supprimé ; donc copie la chaîne, avec g_strdup() par exemple.

    Ensuite, g_signal_connect() ne prends que 4 paramètres, le premier n'étant d'ailleurs pas un gpointer mais un GObject.
    Et pareil, la fonction de callback de l'évènement clicked est définie comme suit :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    void user_function (GtkWidget* widget, gpointer data);


    Je te conseille de potasser un petit tuto avant d'aller plus en avant

    Cordialement,
    moiban


    [edit]
    Grilled

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 17
    Par défaut
    hum désolé pour la présentation, j'avais oublié ces balises :p et puis j'ai toujours eu des problèmes avec la manipulation de chaines de caractères, je sais pas pourquoi mais c'est pas du tout intuitif...

    bon j'ai essayé de modifié ma structure joueur pour pouvoir modifier le nom plus facilement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct{
      int couleur;
      int compteur;
      ListeDeCartes jeux;
      char *nom;
        }  Joueur;
    et de remplir les noms de cette manière (en oubliant l'histoire du g_signal_connect() et ses paramètres :p je pense créer une structure pour y remédier)

    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
     
    void
    on_blancer_clicked                     (GtkButton       *button,
                                            GtkWidget *nom1, GtkWidget *nom2, 
                                            gpointer user_data)
    {
     Joueur joueur1;
     Joueur joueur2;
     const gchar *cible1;
     const gchar *cible2;
     
     cible1 = gtk_entry_get_text(GTK_ENTRY(nom1));
     cible2 = gtk_entry_get_text(GTK_ENTRY(nom2));
     
     joueur1.nom = (char *)malloc(sizeof(char)*20);
     strcpy(joueur1.nom,cible1);
     
     initialiser (joueur1, joueur2);
     gtk_widget_destroy(user_data);
     lancerPartie(joueur1, joueur2);
     
    }
    mais cette fois c'est au niveau du malloc que le compilateur n'est pas content... pourtant j'ai bien regardé les tuto, et il me semble que j'ai bien fait les choses est ce que le problème vient de la structure joueur?

  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
    Citation Envoyé par Florent23 Voir le message
    mais cette fois c'est au niveau du malloc que le compilateur n'est pas content...
    Si les messages d'erreur de ton compilateur sont du type "Je suis le compilateur, et je ne suis pas content!!!", je te suggère de changer de compilateur... La plupart des compilateurs donnent des msgs pour (tenter de) décrire l'erreur qu'ils ont rencontrée...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 17
    Par défaut
    erf pardon j'avais oublié de préciser le message d'erreur: c'est toujours le même qu'avant, invalid use of flexible array member

  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
    T'es sûr d'avoir modifié ton .h ? Un flexible array, c'est un char toto[]; a priori, un char *toto; c'est plus un flexible array, donc le warning ne devrait pas mentionner ça.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 17
    Par défaut
    oui en fait c'était ça mon problème, je travaille avec dev cpp et mon .h n'était pas modifié au bon endroit... d'où le problème
    et j'ai réussi à faire ma structure pour passer tous mes arguments, donc merci beaucoup pour votre aide

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 32
    Par défaut
    Salut,

    Citation Envoyé par Florent23 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ...
     
     Joueur joueur1;
     Joueur joueur2;
     const gchar *cible1;
     const gchar *cible2;
     
     cible1 = gtk_entry_get_text(GTK_ENTRY(nom1));
     cible2 = gtk_entry_get_text(GTK_ENTRY(nom2));
     
     joueur1.nom = (char *)malloc(sizeof(char)*20);
     strcpy(joueur1.nom,cible1);
     
    ...
    Plutôt que d'allouer la place manuellement, et peut-être pas assez (imagine que cible1 fasse 21 cractères ? ), tu peux utiliser les fonctions bien pratique de la GLib, comme g_strdup()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    joueur1.nom = g_strdup (gtk_entry_get_text(GTK_ENTRY(nom1)));

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/11/2007, 13h14
  2. Enlver un noeud dans une structure XML
    Par Sharingan dans le forum ASP
    Réponses: 4
    Dernier message: 20/12/2004, 08h08
  3. Récupération de données validées dans une pop-up
    Par hdd dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/12/2004, 16h47
  4. donée de plusieur vecteur dans une structure ??
    Par lipczynski dans le forum C++
    Réponses: 5
    Dernier message: 13/08/2004, 08h17
  5. type void* dans une structure
    Par barbapapaz dans le forum C
    Réponses: 3
    Dernier message: 16/07/2004, 16h11

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