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 :

Problème avec gtk_entry_set_text


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Par défaut Problème avec gtk_entry_set_text
    Bonjour,

    Je suis débutant en programmation et essaye actuellement de réaliser un sudoku en C en utilisant gtk+.
    J'ai écrit une fonction pour manipuler ma barre de menu et assigner une fonction à chaque élément du menu.
    Dans un premier temps, je souhaite initialiser ma grille à 0 en utilisant gtk_entry_set_text et mettre des zéros dans toutes les cases.

    Cela fonctionne directement après la création des widgets gtkEntry (widget[i][j]=gtk_entry_new(); ) mais pas dans ma fonction qui gère les événements.

    J'obtiens une belle erreur à la compilation :
    error: subscripted value is neither array nor pointer
    ligne 24 dans l'extrait de code . J'ai pensé à un problème de paramètre de la fonction, mais après plusieurs heures passées à m'arracher les cheveux je n'ai toujours pas trouvé comment résoudre mon problème.

    Voici ma fonction
    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
    static GtkWidget* widget[9][9];
    ....
    for (i =0; i<9; i++)
        {
            for (j=0;j<9;j++)
            {
                    widget[i][j]=gtk_entry_new();
                    //gtk_entry_set_text(GTK_ENTRY(widget[i][j]), "0"); /*fonctionne parfaitement ici*/
    }            
        }
    ....
    g_signal_connect(menuItem,"activate",G_CALLBACK(menuEvenement), NULL);
    ....
    static void menuEvenement(GtkWidget *widget, gpointer data)
    {
        if(strcmp(gtk_menu_item_get_label(GTK_MENU_ITEM(widget)),"Grille vide") == 0 )//si le label de l'élément du menu correspond à grille vide, on inscrit 0 dans toutes les cases
                    {
                        int i,j;
     
                        for (i=0;i<9;i++)
                        {
                            for (j=0;j<9;j++)
                            {
     
                               gtk_entry_set_text(GTK_ENTRY(widget[i][j]), "0"); /* mais pas ici, problème de paramètres ? */
     
                            }
                        }
    .......
                    }
    Merci pour votre aide.

  2. #2
    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
    Bonjour Armand,

    bon, pour un débutant en programmation, tu as bien découpé et montrer tous les morceaux de code permettant de trouver la cause du problème, et ça c'est bien

    Du coup ton soucis est un problème de visibilité de variable. Ta variable statique s'appelle widget, tout comme ton paramètre de ta callback. Le nom de la variable locale "masque" alors la variable globale. Autrement le compilateur n'aurait aucun moyen de savoir de laquelle tu parles. En C++, tu écrirait ::widget (note le préfixe deux-points) pour parler de la variable globale, mais en C, tu es à ma connaissance coincé. Solution, changer l'un au l'autre des noms. Tu en trouveras plus dans un bon bouquin de C au chapitre "portée et visibilité des variables".

    PS: les variables globales c'est le mal

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Par défaut
    Un grand merci à toi liberforce. J'ai changé le nom de mon widget et ça marche !
    Cela faisait des heures que je cherchais.

    Pourquoi est-ce forcément une mauvaise chose de déclarer en global (vu que ma grille sera utilisée partout?

  4. #4
    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
    Ce n'est pas forcément toujours le mal, mais il faut prendre conscience que toutes les fonctions on accès à ces variables. Du coup, bien souvent, on finit par avoir du mal à savoir qui a modifié quoi, et quand. Une meilleure approche est plutôt de ne donner accès aux variables à modifier que aux fonctions réellement censées les modifier (en les passant en paramètres de fonctions). Tu sais ainsi directement si ta fonction peut ou ne peut pas modifier ta variable.

    Le fait d'utiliser des getter/setter est l'étape suivante: par exemple des fonctions set_my_value et get_my_value permettent de retrouver plus facilement quand tu modifies une valeur ou quand tu la lis, par une simple recherche dans le code source. C'est aussi plus facile de mettre des traces pour suivre l'évolution d'une valeur (tu n'as que ces 2 fonctions à modifier, au lieu de retrouver toutes les lignes qui utilisent ta variable).

    Pour finir, dans le cas d'une interface graphique en GTK, j'ai tendance à créer une structure regroupant tous mes widgets, représentative de mon interface. Ainsi, si j'ai besoin de rajouter un widget, je l'ajoute à ma structure. Comme tu n'as qu'un seul paramètre user_data dans les callbacks qui permet de récupérer des données fournies à la connexion du signal, la structure est un passage obligé dès que tu veux pouvoir accéder à plusieurs variables sans qu'elles soient globales. Du coup tous mes programmes GTK commencent par la déclaration d'une structure contenant mes widgets, et l'instanciation de cette structure dans le main, dans la pile. Sa durée de vie est celle du programme.

    Ex:
    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
     
    #include <gtk/gtk.h>
     
    typedef struct
    {
    	GtkWidget *window;
    	GtkWidget *button;
    } Ui;
     
    // ici, G_GNUC_UNUSED sert just à dire au compilateur que le fait de ne pas utiliser
    // ces paramètres n'est pas une erreur de ma part
    void on_destroy (GtkWidget *widget G_GNUC_UNUSED, gpointer user_data G_GNUC_UNUSED)
    {
    	gtk_main_quit();
    }
     
    int main (int argc, char *argv[])
    {
    	Ui ui;
    	gtk_init (&argc, &argv);
     
    	ui.window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	ui.button = gtk_button_new_with_label ("Hello World");
    	gtk_container_add (GTK_CONTAINER(ui.window), ui.button);
    	gtk_widget_show_all (ui.window);
     
    	// ici je pourrais passer en dernier argument &ui si j'avais besoin de manipuler
    	// l'interface graphique dans la callback on_destroy. Je la récupérerais alors
    	// dans le paramètre user_data de la callback.
    	g_signal_connect (ui.button, "destroy", G_CALLBACK (on_destroy), NULL);
     
    	gtk_main();
    	return 0;
    }

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3
    Par défaut
    Merci à toi pour ces explications. Je pense avoir compris comment faire. En effet cela semble beaucoup plus structuré et rigoureux.

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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