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 :

Structure et cast


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Structure et cast
    Si, j'ai une structure de ce type, je cherche à caster le void* comme suit.
    Je sais que ma syntaxe n'est pas bonne mais est-ce au moins possible ?
    Si oui, comment ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct toto
    {
     void *a;
    }
     
    void foo(struct toto *b)
    {
    // syntaxe ?
    b->(char)a = 'c';
    }
    Merci d'avance pour vos réponses.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    Bonjour,

    au lieu de caster a en char, tu dois plutôt caster 'c' en (void*), comme ceci :


  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par taraa Voir le message
    Si, j'ai une structure de ce type, je cherche à caster le void* comme suit.
    Je sais que ma syntaxe n'est pas bonne mais est-ce au moins possible ?
    Si oui, comment ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct toto
    {
     void *a;
    }
     
    void foo(struct toto *b)
    {
    // syntaxe ?
    b->(char)a = 'c';
    }
    Merci d'avance pour vos réponses.
    a est un pointeur donc représente une adresse mémoire. Tu as le droit d'y mettre le caractère 'c' (qui n'est finalement rien de plus qu'un simple nombre) mais il n'est pas fait pour ça !!!

    Mais sinon, étant donné qu'un pointeur universel peut recevoir n'importe quoi, pas besoin de cast
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void foo(struct toto *b)
    {
        b->a = 'c';
    }

    Maintenant, si a n'était pas "void*" mais "qqchose*", alors le cast marche dans le sens "je transforme ce que j'y mets dans le type prévu pour le recevoir" et la syntaxe serait
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void foo(struct toto *b)
    {
        b->a = (qqchose*)'c';
    }
    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]

  4. #4
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Mais sinon, étant donné qu'un pointeur universel peut recevoir n'importe quoi, pas besoin de cast
    Ah oui, en effet ça m'était sorti de la tête...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Merci pour ce début de réponse, je commence à comprendre le fonctionnement du cast mais je ne vois pas comment l'utiliser avec des pointeurs génériques.

    C’était ma réelle question mais j'ai trop simplifié mon problème.

    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
    struct num_int
    {
    int val;
    };
     
    struct num_float
    {
    float val;
    };
     
    struct toto
    {
    // a est soit de type struct num_float soit de type struct num_int
     void *a;
    };
     
    void foo(struct toto *b)
    {
     
    b->a->val = 0;
    }
    Quand je compile ce code, j'obtient :
    error: request for member `val' in something not a structure or union
    PS : la structure toto, contient aussi une variable qui décrit le type de a,
    mais la n'est pas la question.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par taraa Voir le message
    Merci pour ce début de réponse, je commence à comprendre le fonctionnement du cast mais je ne vois pas comment l'utiliser avec des pointeurs génériques.

    C’était ma réelle question mais j'ai trop simplifié mon problème.

    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
    struct num_int
    {
    int val;
    };
     
    struct num_float
    {
    float val;
    };
     
    struct toto
    {
    // a est soit de type struct num_float soit de type struct num_int
     void *a;
    };
     
    void foo(struct toto *b)
    {
     
    b->a->val = 0;
    }
    Quand je compile ce code, j'obtient :
    error: request for member `val' in something not a structure or union
    He oui. b->a n'est pas d'un type contenant val. Il te faudra spécifier, à chaque fois que tu veux utiliser a, ce qu'est ce a !!!
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void foo(struct toto *b)
    {
    *((struct num_int*)(b->a)).val = 0;
    // Accessoirement, il se peut que ((struct num_int*)(b->a))->val marche aussi mais je suis mitigé...
    }

    Accessoirement, ça devient un poil compliqué. Tu sais que t'as les union qui te permettent de gérer plus simplement des types multiples...
    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]

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu sais que t'as les union qui te permettent de gérer plus simplement des types multiples...
    Non, je vais me renseigner, en tout cas pour votre aide.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par taraa Voir le message
    Non, je vais me renseigner
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    union u_toto {
         char c;
         int i;
         double d;
    } var;

    A partir de là, chaque membre c, i et d occupent le même espace mémoire (qui a la taille du plus grand des types présents).
    Tu peux mettre un int dans var.i et t'en servir tant que tu veux mais si tu mets ensuite un double dans var.d tu perds alors la valeur de var.i...
    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]

+ 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