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 :

Callback, structures et boucle


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut Callback, structures et boucle
    Bonjour,

    j'ai déjà parcouru les forums et le net pour essayer de résoudre mon problème mais il est un petit peu différent de ceux liés au passage de structures simples dans un callback.

    Je génère un tableau de boutons à l'aide de deux boucles. Chaque bouton contient une image. J'aimerais changer d'image au clic sur le bouton à l'aide de la fonction : gtk_button_set_image(bouton,image);
    J'y arrive très bien pour un bouton simple, qui n'est pas compris dans un tableau et avec une image non stockée dans une structure .
    Or, mes images sont stockées dans un tableau d'images de la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct case_plateau
    {
        GtkWidget *image1[35];//image visible avant le clic
        GtkWidget *image2[35];//image visible après le clic
        GtkWidget *bouton[35];//bouton correspondant
        int i,j;
    }t_case;
    Voici mes boucles qui associent une image à chaque bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    t_case case_jeu;
    for(case_jeu.i=0;case_jeu.i<6;case_jeu.i++)
        {
            for(case_jeu.j=0;case_jeu.j<6;case_jeu.j++)
            {
                init_image(&case_jeu,a,nb1,nb2);//appel de la fonction qui associe une image à chaque bouton
                case_jeu.boutton[case_jeu.j] = gtk_button_new();          gtk_button_set_image(case_jeu.boutton[case_jeu.j],case_jeu.image1[case_jeu.j]);//on associe l'image1 au bouton
                ...//ajout du bouton à la table
                g_signal_connect(G_OBJECT(case_jeu.boutton[case_jeu.j]), "clicked", G_CALLBACK(clic1_sur_case), &case_jeu);//je transmet ma structure à ma fonction callback
            }
        }
    Le tableau marche et les boutons contiennent bien image1. Image2[j] contient bien des images.
    J'aimerais maintenant associer dans mon fonction "clic1_sur_cas" mon image2 à mon bouton. Voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void clic1_sur_case(GtkWidget *monbouton, gpointer data)
    {
        t_case *testcase = (t_case *)data;//Je cast data
    gtk_button_set_image(monbout->boutton[monbout->j],testcase.image2[testcase.j]);
    }
    Mon programme plante lorsque je clique sur le bouton.
    Pouvez-vous me dire où est-ce que je me suis trompé ?

    Je vous remercie d'avance.

  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
    La structure "case_jeu" que tu transmets au callback sera la même pour tous tes boutons, donc ça ne va pas faire ce que tu veux. De plus j'ai la forte impression que c'est une variable locale à la fonction qui initialise tout, donc elle n'existera plus en mémoire quand tes callbacks seront appelés.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    La structure "case_jeu" que tu transmets au callback sera la même pour tous tes boutons, donc ça ne va pas faire ce que tu veux.
    Quelle serait alors l'alternative ? Passer par deux structures différentes ?

    Citation Envoyé par teuf13 Voir le message
    De plus j'ai la forte impression que c'est une variable locale à la fonction qui initialise tout, donc elle n'existera plus en mémoire quand tes callbacks seront appelés.
    Pourtant la structure case_jeu qui passe par une fonction "void init(t_case * case_jeu)" me ressort bien les valeurs que je veux dans mon main.

  4. #4
    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 cb450 Voir le message
    Quelle serait alors l'alternative ? Passer par deux structures différentes ?
    Je pense que j'allouerais une structure bcp plus simple à chaque itération dans la boucle qui contiendrait juste l'image avant/après pour le bouton auquel tu associes le callback. Beaucoup moins de risques de s'embrouiller avec les pointeurs en faisant comme ça.


    Citation Envoyé par cb450 Voir le message
    Pourtant la structure case_jeu qui passe par une fonction "void init(t_case * case_jeu)" me ressort bien les valeurs que je veux dans mon main.
    Pourtant ton programme plante pour des raisons mystérieuses Quand je dis "j'ai l'impression que", je veux dire que la façon dont t'as présenté ton code me donne cette impression, mais j'ai pas suffisammnet de code pour en être certain, donc c'est une invitation à vérifier ce point.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    Pourtant ton programme plante pour des raisons mystérieuses Quand je dis "j'ai l'impression que", je veux dire que la façon dont t'as présenté ton code me donne cette impression, mais j'ai pas suffisamment de code pour en être certain, donc c'est une invitation à vérifier ce point.
    En fait, ma fonction callback "entre" bien dans ma fonction, j'ai fait les tests, ça marche sur toutes les cases[j]. Seulement, elle n'a pas l'air de bien transmettre ma structure à ma fonction ou alors je me plante à la réception.

    J'ai essayé avec un bouton à part et une structure "simplifiée".
    Ma structure (dans un .h) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct case_jeu
    {
    int test;
    }t_case
    Mon main (en fait c'est une fonction, mais c'est dans celle là que je déclare ma variable de type t_case*)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    t_case case_jeu;
    case_jeu.test=20;
    GtkWidget *btn;
    ... //blabla, je crée le bouton
    g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(clic1_sur_case), &case_jeu);
    Ma fonction clic1_sur_case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void clic1_sur_case(GtkWidget *monbout, gpointer data)
    {
        t_case* testcase = (t_case*)data;
        printf("%d\n", testcase->t);
    }
    Ça m'affiche quelque chose(une adresse) mais pas mon nombre 20.
    Où est-ce que je me trompe, telle est la question

  6. #6
    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
    Encore une fois, si tu fais

    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
     
    void init (..) {
        t_case case_jeu;
    ...
        g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(clic1_sur_case), &case_jeu);
    ...
    }
     
    int main (int argc, char **argv) 
    {
    ...
        init (...);
        ...
        gtk_main();
    }
    Ca ne fonctionnera pas, au moment où ton signal est invoqué, case_jeu n'existe plus nul part

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

Discussions similaires

  1. Structure en boucle des fichiers plats.
    Par Domingo60 dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 15/10/2010, 14h29
  2. Callback dans une boucle for
    Par bellionth dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 18/06/2010, 09h42
  3. Commande Structure et boucle FOR
    Par angelevil dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/08/2009, 01h10
  4. [AC-2007] Structure de boucle
    Par louroulou dans le forum VBA Access
    Réponses: 3
    Dernier message: 26/08/2009, 09h15
  5. [Débutant] Structure et boucles
    Par rob408231 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/04/2009, 20h30

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