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 :

structure, tableau et pointeur


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Par défaut structure, tableau et pointeur
    Bonjour a tous, donc je pratique le C depuis quelques mois ainsi que GTK.
    Je n'arrive pas à mettre le doigt sur une erreur concernant apparement un pointeur permettant de remonter dans une structure seulement le point où je souhaite remonter est un tableau.
    Voici le code:

    la structure en question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct {
     
            GtkWidget* widget;
            GtkWidget* image;
            _Bool libre;
            short int proprietaire;
            guint posX;
            guint posY;
            struct reversiCase* pPlateau;
     
    }reversiCase;
    le type guint correspond au type unsigned int défini dans Glib

    Le tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reversiCase plateau[LGMAX][LGMAX];
    LGMAX est une constante paire.

    La partie du code ou ça ne va pas:
    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
    for( y = 0; y < LGMAX; y++ )
    {
           pHBoxLignePlateau[y] = gtk_hbox_new(FALSE, 0);
           gtk_box_pack_start( GTK_BOX( pVBoxPlateau ), pHBoxLignePlateau[y], FALSE, FALSE, 0);
           
           for( x = 0; x < LGMAX; x++)
                {
    
                        plateau[x][y].widget = gtk_button_new();
                        plateau[x][y].image = gtk_image_new();
                        plateau[x][y].libre = TRUE;
                        plateau[x][y].posX = x;
                        plateau[x][y].posY = y;
                        plateau[x][y].pPlateau = &plateau[x][y]; //WARNING ici !
                        gtk_container_add(GTK_CONTAINER(plateau[x][y].widget), plateau[x][y].image);
                        gtk_widget_set_usize(plateau[x][y].widget, 50, 50); 
                        g_signal_connect(G_OBJECT(plateau[x][y].widget), "clicked", G_CALLBACK(clickCase), plateau[x][y].pPlateau);
                        gtk_box_pack_start( GTK_BOX( pHBoxLignePlateau[y] ), plateau[x][y].widget, FALSE, FALSE, 0);
    
    
                }
    }
    ici, x et y sont de type int, et voici ma fonction "clickCase"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void clickCase( GtkWidget* pWidget, gpointer* pData ){
         
         gtk_image_set_from_file(GTK_IMAGE(plateau[pData->posX][pData->posY].image),"images/pion_blanc.png"); //ERREUR ici !
         printf("fonction executee\n");
    
    }
    Les erreurs montrées par le compilateur (gcc sous devcpp):
    request for member `posX' in something not a structure or union
    request for member `posY' in something not a structure or union

    g_signal_connect(); ne prend que 4 arguments, dont le dernier est l'argument à passer à la fonction utilisé par le Callback (ici clickCase). Hors j'ai besoin d'en passer plusieurs, par conséquent j'ai crée la structure reversiCase dans laquelle se situe toutes les données que je souhaite passer en argument à clickCase (du moins certains) avec le pointeur pPlateau qui me permet d'avoir accès à tout les champs de la structure (c'est ce pointeur que je souhaite passer en argument à clickCase via le g_signal_connect(); ).

    En espèrant etre assez claire, merci d'avance.

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

    c'est plutot bizzare que la définition de la structure ne génére pas d'erreur à la compilation, normalement il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct reversiCase {
     
            GtkWidget* widget;
            GtkWidget* image;
            _Bool libre;
            short int proprietaire;
            guint posX;
            guint posY;
            struct reversiCase* pPlateau;
    }reversiCase_s;
    Par contre tu signale deux erreurs dans le code qui sont différentes des messages du compilateur

  3. #3
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par gege2061
    Bonjour,
    c'est plutot bizzare que la définition de la structure ne génére pas d'erreur à la compilation....
    En effet c'est très bizarre.
    D'ailleurs pourquoi la définition suivante ne génère pas d'erreur (avec comme option de compilation -Wall uniquement) ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
          int a;
          int b;
          struct nimportequoi *c;
    } mystruct;
    Et celle là en génère une !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
          int a;
          int b;
          struct nimportequoi c;
    } mystruct;
    Que faudrait-il mettre comme option de compilation pour faire hurler le compilateur dans tout les cas ?

  4. #4
    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 crocodilex
    D'ailleurs pourquoi la définition suivante ne génère pas d'erreur (avec comme option de compilation -Wall uniquement) ?
    Même avec le mode parano (-W -Wall -O2 -ansi -pedantic) je n'ai pas d'erreur

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est normal : C'est indispensable pour des références croisées: Un pointeur de structure DOIT pouvoir être déclaré même si le compilo ne sait pas ce qu'il y a au bout (il doit juste savoir que c'est une structure).

    Votre erreur, elle vient d'une tentative de conversion de pointeur vers tableau à deux dimensions, sans typecast d'aucune sorte.
    Le compilateur ne peut pas deviner la seconde dimension...

    [ Erreur : j'ai mal lu le code ]
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Médinoc
    Votre erreur, elle vient d'une tentative de conversion de pointeur vers tableau à deux dimensions, sans typecast d'aucune sorte.
    Le compilateur ne peut pas deviner la seconde dimension...
    Tu parles de quelle erreur (dans quelle partie du code) ?

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gege2061
    c'est plutot bizzare que la définition de la structure ne génére pas d'erreur à la compilation, normalement il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct reversiCase {
     
            struct reversiCase* pPlateau;
    }reversiCase_s;
    Rien de bizarre.
    est une définition valide.
    de même que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct s;
     
    struct s *p;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct s
    {
       struct s *p;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct s
    {
       struct s *p;
    }
    s_s;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct
    {
       struct s *p;
     }
    s_s;
    Le dernier cas est, il est vrai un peu étrange, mais valide. Simplement, on a pas le lien (alias) entre struct s et s_s.

    Vérification :
    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
     
    int main (void)
    {
       struct sa *pa;
       struct sb;
     
       struct sc *pc;
       struct sd
       {
          struct sd *p;
       };
       typedef struct se
       {
          struct se *p;
       }
       s_se;
     
       typedef struct
       {
          struct sf *p;
       }
       s_sf;
     
       return 0;
    }

Discussions similaires

  1. tableau de pointeur de structure
    Par kayenne77 dans le forum Débuter
    Réponses: 5
    Dernier message: 24/01/2009, 18h18
  2. Tableau de pointeurs de structures
    Par jovds dans le forum C
    Réponses: 2
    Dernier message: 11/11/2007, 21h01
  3. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  4. Réponses: 7
    Dernier message: 16/04/2007, 13h39
  5. Réponses: 67
    Dernier message: 13/02/2007, 18h08

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