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

C Discussion :

Casts et structures


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Par défaut Casts et structures
    Bonjour a tous.

    Je suis actuellement confronté a un problème syntaxique lorsque j'essaye de caster le membre d'une structure. Voici ce qui me pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void exec_div(t_div *operation)
    {
    a = (operation->((t_integer_op*)div_op))->a;
    }
    Avec ce qui suis comme structures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct s_div
    {
      t_div_type	div_type;
      void		*div_op;
    }  t_div;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct s_integer_op
    {
      int	a;
      int	b;
      int	res;
    }                t_integer_op;
    En realite, le pointeur void *div_op pointe sur une structure de type t_integer_op. C'est ce que j'essaye de caster, mais bizarrement gcc me sort ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: expected identifier before '(' token
    En revanche, une code comme celui-ci fonctione :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((t_instruction*)data)->operation
    Merci d'avance pour votre aide

    wILL

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par will74 Voir le message
    Bonjour a tous.

    Je suis actuellement confronté a un problème syntaxique lorsque j'essaye de caster le membre d'une structure. Voici ce qui me pose problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void exec_div(t_div *operation)
    {
    a = (operation->((t_integer_op*)div_op))->a;
    }
    Avec ce qui suis comme structures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct s_div
    {
      t_div_type	div_type;
      void		*div_op;
    }  t_div;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct s_integer_op
    {
      int	a;
      int	b;
      int	res;
    }                t_integer_op;
    En realite, le pointeur void *div_op pointe sur une structure de type t_integer_op. C'est ce que j'essaye de caster, mais bizarrement gcc me sort ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: expected identifier before '(' token
    Salut

    C'est pas div_op qu'il te faut caster, car div_op n'existe pas.
    C'est operation->div_op qu'il te faut caster en t_integer_op*...

    Ceci devrait (au conditionnel car pas testé) marcher
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void exec_div(t_div *operation)
    {
        a = ((t_integer*)(operation->div_op))->a;
    }
    J'ai mis un peu plus de parenthèses que nécessaire car j'ai un doute sur les priorités des opérateurs mais à mon avis, ceci fonctionne aussi...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void exec_div(t_div *operation)
    {
        a = ((t_integer*)operation->div_op)->a;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Par défaut
    Merci pour ta réponse.

    Mais imaginons que le pointeur opération reçu en paramétré soir typé en void (dans le prototype de la fonction), comment faire ? Je suis paume avec ce jeu de parenthèses ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void exec_div(void *operation)
    {
        a = ((t_integer*)(operation->div_op))->a;
    }
    Car il faut alors caster operation et div_op en même temps.

    Edit : J'ai résolu le problème tout seule finalement. Merci quand même

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par will74 Voir le message
    Merci pour ta réponse.

    Mais imaginons que le pointeur opération reçu en paramétré soir typé en void (dans le prototype de la fonction), comment faire ? Je suis paume avec ce jeu de parenthèses ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void exec_div(void *operation)
    {
        a = ((t_integer*)(operation->div_op))->a;
    }
    Car il faut alors caster operation et div_op en même temps.
    Pas "en même temps" !!!
    operation doit être casté en t_div*, et le membre résultant div_op doit être casté en t_integer*...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void exec_div(void *operation)
    {
        a = ((t_integer*)(((t_div*)operation)->div_op))->a;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Par défaut
    OUI J'ai finalement reussi a trouve tout seul en cherchant comme un dingue. Merci pour ton aide

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/09/2009, 11h36
  2. Reflection : Cast type structure
    Par titoftit dans le forum C#
    Réponses: 5
    Dernier message: 11/06/2008, 14h10
  3. Problème de cast dans structure
    Par pdgnr dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/08/2007, 15h12
  4. Réponses: 9
    Dernier message: 14/01/2007, 16h40
  5. Cast de structures
    Par glKabuto dans le forum C
    Réponses: 29
    Dernier message: 02/06/2006, 11h05

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